Автоматическое выключение Android, когда приложение переходит на задний план

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

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

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

Итак, если я не могу зацепить ключ HOME, какие другие варианты есть? Очевидно, что просто onPause() не поможет, потому что это Activity specific.

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

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

Solutions Collecting From Web of "Автоматическое выключение Android, когда приложение переходит на задний план"

// использовать сервис

// в этом

 @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 } } 

Мы перешли на что-то, основанное на решении здесь @peceps: Запустите код, когда приложение Android закрыто / отправлено на задний план .

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

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

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

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

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

Этот метод, найденный в классе Activity

 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. Создайте базовую Activity и переопределите ее onStop() для выхода с сервера
  2. Все Activities моего приложения будут расширяться выше базового класса.

Итак, теперь, что произойдет, если в какой-либо Activity переходит в состояние onStop, он выйдет из сервера независимо от того, как Activity переходит в фоновый режим

Примечание. Но если вы с вашего кода прекратите любое действие, нажав «Закончить», то он также выйдет из системы, поэтому вам придется работать в этом сценарии

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