Как определить, покинул ли пользователь мое приложение?

Я разрабатываю приложение для Android, и я хочу обнаружить, когда пользователь выходит из моего приложения, либо нажав кнопку «Назад», либо кнопку «Домой».

Кроме того, событие, подобное onInit() было бы полезно в моем сценарии, так как я просто хочу MyInıt запустить действие MyInıt .

onDestroy() не вызывается, пока другим приложениям не потребуется больше памяти.

Solutions Collecting From Web of "Как определить, покинул ли пользователь мое приложение?"

Если ваша деятельность является последней в стеке, тогда обнаружение кнопки «Назад» с помощью onKeyDown разрешит 1/2 этого

Домашний ключ немного сложнее, нет абсолютного метода, но вы можете сделать что-то подобное, что работает для моих простых потребностей.

OnUserLeaveHint вызывается в соответствии с документацией, когда пользователь нажимает кнопку «домой» или когда что-то прерывает ваше приложение (например, входящий телефонный звонок), поэтому догадайтесь, какой именно вы используете метод onUserInteraction для отметки времени последнего взаимодействия с пользователем.

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

Не уверен, что ваше намерение заключается в том, чтобы поймать кнопку дома, так или иначе, это упрощенный способ сделать это, я использую забор на 100 мс вокруг двух событий, которые я нашел, всегда работал для меня. ПРИМЕЧАНИЕ. Я тестировал только на нескольких телефонах, как и все на Android, ваш пробег будет зависеть от ОС / оборудования (черт возьми, даже материал, который документирован и должен работать иногда)

 long userInteractionTime = 0; @Override public void onUserInteraction() { userInteractionTime = System.currentTimeMillis(); super.onUserInteraction(); Log.i("appname","Interaction"); } @Override public void onUserLeaveHint() { long uiDelta = (System.currentTimeMillis() - userInteractionTime); super.onUserLeaveHint(); Log.i("bThere","Last User Interaction = "+uiLag); if (uiDelta < 100) Log.i("appname","Home Key Pressed"); else Log.i("appname","We are leaving, but will probably be back shortly!"); } 

Примечание. Это работает только в том случае, если ваша цель -> = API14


Вы также можете использовать Application.registerActivityLifecycleCallbacks (), и когда какое-либо действие приостанавливает Runnable Handler с задержкой Runnable (который будет вызывать, когда пользователь оставит приложение). Когда действия создаются / запускаются / возобновляются, вы удаляете Runnable из Handler . Поэтому, когда вы перемещаетесь внутри своего приложения, вы всегда отменяете этот Runnable , но если активирована другая активность не из вашего приложения – будет запущена Runnable .

Я использовал это для выхода из системы, когда он оставил мое приложение, вот код для обратных вызовов:

 public class MyApplication extends Application implements Application.ActivityLifecycleCallbacks { private Handler handler; private Runnable runLogout = new Runnable() { @Override public void run() { //logoutUser() } }; @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(this); handler = new Handler(getMainLooper()); } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { handler.removeCallbacks(runLogout); } @Override public void onActivityStarted(Activity activity) { handler.removeCallbacks(runLogout); } @Override public void onActivityResumed(Activity activity) { handler.removeCallbacks(runLogout); } @Override public void onActivityPaused(Activity activity) { handler.postDelayed(runLogout, 1000); } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } } 

Однако Runnable будет работать не в контексте жизненного цикла активности, поэтому для использования этого в действии вам нужно будет установить и проверить какой-либо флаг всей заявки или передать намерение.

OnUserLeaveHint вызывается в соответствии с документацией, когда пользователь нажимает кнопку «домой» или когда что-то прерывает ваше приложение (например, входящий телефонный звонок), поэтому догадайтесь, какой именно вы используете метод onUserInteraction для отметки времени последнего взаимодействия с пользователем.

Небольшая поправка к ответу «Идистика» – OnUserLeaveHint () не вызывается, когда ваша активность прерывается входящим вызовом. Вот фрагмент из документации для Android –

Вызывается как часть жизненного цикла активности, когда активность собирается перейти в фоновый режим в результате выбора пользователя. Например, когда пользователь нажимает клавишу «Домой», вызывается onUserLeaveHint (), но когда входящий телефонный вызов приводит к тому, что актив в вызове автоматически выводится на передний план, onUserLeaveHint () не будет вызываться при прерывании активности ,

Да, проверьте жизненный цикл приложения – когда пользователь минимизирует или оставляет несколько методов, вызывается onPause () onStop () и onDestroy ()

http://developer.android.com/reference/android/app/Activity.html

Другой вариант, который вы можете рассмотреть, – это проверить кнопку «Назад» или «Домашний ключ». Это делается путем переопределения onKeyDown (), прослушивания заднего ключа / домашнего ключа и переопределения поведения по умолчанию.

Я нашел аналогичный вопрос, который может помочь вам.

Android: подскажите пользователю сохранить изменения при нажатии кнопки «Назад»

ура