OnRestart vs. OnResume - вопрос жизненного цикла Android - PullRequest
13 голосов
/ 28 июня 2011

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

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

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

Учитывая эту диаграмму enter image description here

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

  • КРАСНЫЙ = перемещение между действиями в приложении
  • СИНИЙ = переход к деятельности вне приложения

Не верно ли мое понимание?

РЕДАКТИРОВАТЬ (уточнение конкретного случая использования)

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

Ответы [ 5 ]

4 голосов
/ 28 июня 2011

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

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

1 голос
/ 25 апреля 2012

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

  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, я оставлю это вам, чтобы преобразовать его !!

1 голос
/ 28 июня 2011

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

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

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

0 голосов
/ 12 января 2015

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

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

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

0 голосов
/ 28 июня 2011

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

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

...