OnRestart против OnResume – вопрос жизненного цикла Android

Моя конечная цель – иметь приложение, которое запускает блок кода, когда он (приложение, а не активность) открывается после того, как он оставлен (назад с главного экрана и т. Д.).

В соответствии с жизненным циклом деятельности это должно быть onRestart() для каждой активности (по крайней мере, как я ее интерпретирую)

И onRestart() и onResume() вызываются, возвращаются ли я к активности в приложении (кнопка возврата) И когда приложение вызывается обратно.

Учитывая эту диаграмму Введите описание изображения здесь

Я интерпретирую это так:

  • RED = перемещение между действиями в приложении
  • BLUE = переход к активности за пределами приложения

Непонятно ли мое понимание?

EDIT (Уточнение конкретного варианта использования)

Я пытаюсь использовать onRestart () для репликации некоторой логики безопасности (проверка PIN-кода), найденной в onCreate (), но она вызывается, даже когда я нажимаю кнопку «Назад» внутри приложения …

Solutions Collecting From Web of "OnRestart против OnResume – вопрос жизненного цикла Android"

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

Если я понимаю, что вы хотите сделать правильно, вы хотите поместить свой код в onCreate, а не в onRestart.

СМОТРИТЕ КОММЕНТАРИЙНУЮ РЕЗЬБУ ДЛЯ ОТВЕТА

Мое замечание состоит в том, что его трудно связать события жизненного цикла с поведением пользователя на устройстве или эмуляторе. Если ваше приложение приостановлено, если устройству требуется память или требуется восстановить ресурсы, он прекратит действие, вызвав вызов функции. Слишком много сценариев для создания адекватной конечной машины, чтобы сказать себе «как» или «почему» ваша деятельность была прекращена.

Единственный способ, которым я нашел это, – создать службу для хранения состояния приложения и управления вручную. Проблема заключается в попытке использовать состояние Activity для управления состоянием приложения. Дизайн деятельности, похоже, имеет ограничения, которые просто делают его плохим выбором для достижения поставленной вами цели.

Вот как это сделать: –

  1. У вас есть базовая активность, из которой происходят все ваши действия.

  2. Добавьте в базовую деятельность: –

     int nAppState; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); nAppState = 0; . . } protected override void OnStop() { AppState(); base.OnStop(); } public static int IMPORTANCE_BACKGROUND = 400; protected override void AppState() { ActivityManager am = (ActivityManager)GetSystemService(Context.ActivityService); IList<ActivityManager.RunningAppProcessInfo> list2 = am.RunningAppProcesses; foreach (ActivityManager.RunningAppProcessInfo ti in list2) { if (ti.ProcessName.ToLower() == "com.mycompany.myapp") { nAppState = ti.Importance; break; } } } protected override void OnRestart() { base.OnRestart(); if (nAppState == IMPORTANCE_BACKGROUND) { // Show a log in screen RunOnUiThread(delegate { StartActivity(new Intent(this, typeof(LoginAppearActivity))); }); nAppState = 0; } } 
  3. Обратите внимание, что это в Mono C #, это будет тот же код для Java, я оставлю его для вас, чтобы преобразовать его!

Да, ваши утверждения для красного и синего правильны.

Однако обратите внимание на альтернативный путь от onPause () и onStop (). Процесс, убиваемый по соображениям памяти, является: а) из-за вашего контроля и б) незаметным для вас, если вы только используете onRestart (), чтобы обнаружить «возвращение» к активности.

У вас есть возможность избежать предыдущей активности, избегая / удаляя активность, входящую в стек, путем установки некоторого флага перед вызовом функции startActivity (намерение):

 intent.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); 

Это позволит избежать текущей активности, которую нужно вызвать в обратном прессе. В качестве альтернативы вы также можете использовать метод onBackPressed () для текущей активности.