Ответ 1
Мы перешли на что-то, основанное на решении здесь @peceps: Выполнить код, когда приложение Android закрыто/отправлено на фоновое изображение.
Я хочу определить, когда мое приложение отправлено на задний план. Существует много вопросов о подключении ключа HOME - я понимаю, что это возможно, только зарегистрировавшись как приложение для запуска.
... НО... как всегда есть клиент, который хочет определенного поведения...
У нас есть приложение с высокими требованиями безопасности. Клиент хочет, чтобы приложение выходило из сервера, когда приложение переходит в фоновый режим по какой-либо причине (телефонный звонок, HOME-ключ, назад к последней активности) ( * *, чтобы уточнить, я имею в виду, что когда передняя активность на экран не относится к моим приложениям **).
Итак, если я не могу зацепить ключ HOME, какие другие параметры есть? Очевидно, что просто подключение onPause()
не поможет, потому что это Activity
-специфическое.
"Лучший", который мы придумали, состоит в том, чтобы сохранить массив ссылок на действия в нашем классе Application. В каждом действии onResume()
мы добавляем его в этот массив. В onPause()
мы удалим его. Также в onPause()
мы перечисляем этот массив, чтобы узнать, находится ли какой-либо из зарегистрированных действий на переднем плане. Если активность переднего плана не обнаружена, пользователь выйдет из системы.
Я недоволен этим как решением и надеюсь найти лучший способ.
Мы перешли на что-то, основанное на решении здесь @peceps: Выполнить код, когда приложение 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
}
}
Я обработал его, сохранив метку времени, когда моя активность закрывается\паузы. Когда начинается другое действие, он считывает метку времени, и если она изменяется более чем на шесть секунд, я выполняю выход из системы.
Если вам необходимо физически выполнить выход из системы (то есть на удаленном сервере), настройте 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 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.
Я не знаю, поможет ли он вам помочь, но я попытаюсь таким образом
Activity
и переопределите ее метод onStop()
для выхода с сервераActivities
моего приложения будут расширены над базовым классом.Итак, что происходит, если на какой-либо Activity переходит в onStop условие, он выйдет из сервера независимо от того, как Activity переходит в фоновый режим.
Примечание: Но если вы с вашего кода прекратите любое действие, нажав "Закончить", то он также выйдет из системы, поэтому вам придется работать в этом сценарии
андроид: clearTaskOnLaunch может оказаться полезным. Когда вы переходите на задний план, вы не выходите из системы, но вы можете заставить экран входа в систему первым при возврате.