2012-01-23 6 views
13

Я хочу определить, когда мое приложение отправлено на задний план. Есть много вопросов о подключении ключа HOME - я понимаю, что это возможно, только зарегистрировавшись как приложение для запуска.Android-аут-выход, когда приложение переходит на задний план

... НО ... как всегда есть клиент, который хочет определенное поведение ...

У нас есть приложение с повышенными требованиями к безопасности. Клиент хочет, чтобы приложение выходило из сервера, когда приложение переходит в фоновый режим по любой причине (телефонный звонок, HOME-ключ, назад к последнему действию) (* * , чтобы уточнить, что я имею в виду, когда передняя активность на экране не является одним из видов деятельности моего приложения * *).

Итак, если я не могу зацепить ключ ДОМАШЕГО, то какие еще варианты есть? Очевидно, что просто подключение onPause() не поможет, потому что это Activity -специфичный.

«Лучший», который мы придумали, состоит в том, чтобы хранить массив ссылок на действия в нашем классе Application. В разделе 8 мы добавим его в этот массив. В onPause() мы удаляем его. Также в onPause() мы перечисляем этот массив, чтобы узнать, находится ли какой-либо из зарегистрированных действий на переднем плане. Если активность переднего плана не найдена, пользователь выходит из системы.

Я недоволен этим как решением и надеюсь найти лучший способ.

ответ

5

Мы eneded вверх происходит что-то на основе решения здесь @peceps: Run code when Android app is closed/sent to background.

+1

Я только что добавил новый комментарий к этой теме, где я показываю лучший метод (на мой взгляд), используя Application.ActivityLifecycleCallbacks, а также метод @peceps. См. Мой ответ для потока: http://stackoverflow.com/a/13996042/327386 – RPM

+0

+1 отличное решение для API 14+ –

0

Или вы можете использовать общий объект, который является одиночным, и создать одиночные onPause() и onResume(), которые будут получать/устанавливать данные об этом общем объекте. Эти функции будут использоваться во всех видах деятельности и onResume.

0

Это должно помочь:

Этот метод са найденную в классе активность

protected void onUserLeaveHint() 

    Since: API Level 3 
    Called as part of the activity lifecycle when an activity is about to go into the background as the result of user choice. For example, when the user presses the Home key, onUserLeaveHint() will be called, but when an incoming phone call causes the in-call Activity to be automatically brought to the foreground, onUserLeaveHint() will not be called on the activity being interrupted. In cases when it is invoked, this method is called right before the activity's onPause() callback. 
    This callback and onUserInteraction() are intended to help activities manage status bar notifications intelligently; specifically, for helping activities determine the proper time to cancel a notfication. 
+1

Он указывает, что методы деятельности не будут выполняться, поскольку он использует несколько действий. На самом деле не имеет значения, используете ли вы onPause или onUserLeaveHint. Единственное реальное различие в том, что второй уволен в меньшем количестве случаев, чем первый. – dtech

1

я работал до того, чтобы решить ту же проблему, но не было никакого способа сделать это, как я знаю, кроме ваш путь использую в настоящее время , и лучший метод переопределения для отображения состояния активности активности - onStart(), onStop(), этот метод захватывает реальное изменение видимости и подсчитывает количество стеков ваших действий для выхода из системы.

0

Я не знаю, если его собираются, чтобы помочь вам, но я буду стараться таким образом

  1. Создать базу Activity и переопределить его метод onStop() для выхода с сервера
  2. Все Activities моего приложения будет распространяться выше базового класса.

Так что теперь, что происходит, если на какой-либо активности идет в OnStop состоянии он будет выйти с сервера, независимо от того, как активность идет на фоне

Примечание: Но если вы из вашего кода останавливает любую активность по телефону закончить то и это будет выход из системы, так что вы должны работать в этом сценарии

+0

thx - Я понимаю жизненный цикл действий Android - проблема заключается в том, чтобы найти способ обойти жизненный цикл приложения, и решение разработчиков Android не позволять приложению подключать кнопку HOME. Логика, которую вы упомянули в своем примечании, именно то, что я пытаюсь решить, задавая вопрос. Я ищу элегантный способ сделать это. –

+0

нет проблем в создании метода в вашем BaseActivity, который устанавливает логическое значение true при завершении Activity и проверяет это логическое значение в onStop BaseActivity в зависимости от этого значения logout или наоборот. – ingsaurabh

6

// использование службы

// в том, что

@Override 
    public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 

     IntentFilter filter = new IntentFilter(); 
    filter.addAction(Intent.ACTION_SCREEN_OFF); 
    filter.addAction(Intent.ACTION_CALL); 
    filter.addAction(Intent.ACTION_ANSWER); 

    registerReceiver(mIntentReceiver, filter); 

}

// затем в BroadcastReceiver

private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

      if(action.equalsIgnoreCase("android.intent.category.HOME")) 
      { 
//logout logic 
} 
else if(action.equalsIgnoreCase("android.intent.action.SCREEN_OFF")) 
      { 
//logout logic 
} 

else if(action.equalsIgnoreCase("android.intent.action.DIAL")) 
      { 
//logout logic 
} 
else if(action.equalsIgnoreCase("android.intent.action.CALL")){ 
/ /logout logic 
} 
} 
+0

Мне нравится думать здесь, но есть другие способы перехода деятельности на задний план - например другая деятельность приносит себя на фронт. –

3

Я обработал его, сохранив временную метку, когда моя активность закрывается \ паузы. Когда начинается другое действие, он считывает временную метку, и если она изменяется более чем на шесть секунд, я выполняю выход из системы.

Если вам необходимо физически выполнить выход из системы (то есть на удаленном сервере), настройте AlarmManager, когда действие приостанавливается для выхода из системы в течение шести секунд в будущем. Вы можете отменить этот Тревога, если начинается другое действие до его возникновения.

+0

Идея добавления TimeStamp в ваши действия была блестящей! –

0

android:clearTaskOnLaunch может быть полезно. Когда вы переходите на задний план, вы не выходите из системы, но вы можете заставить экран входа в систему быть первым, когда вы просто возвращаетесь назад.