onNewIntent () жизненный цикл и зарегистрированные слушатели


150

Я использую SingleTop Activity для получения намерений из диалогового окна поиска через onNewIntent().

То, что я заметил, это то, что onPause()вызывается раньше onNewIntent(), а потом - звонит onResume(). Визуально:

  • начато диалоговое окно поиска
  • поисковое намерение возбуждено до деятельности
  • onPause()
  • onNewIntent()
  • onResume()

Проблема в том, что у меня есть зарегистрированные слушатели, onResume()которые удаляются onPause(), но они нужны внутри onNewIntent()звонка. Есть ли стандартный способ сделать этих слушателей доступными?

Ответы:


295

onNewIntent()подразумевается как точка входа для операций с одним объектом, которые уже выполняются где-то еще в стеке и поэтому не могут вызывать onCreate(). С точки зрения жизненного цикла мероприятий, поэтому необходимо позвонить onPause()раньше onNewIntent(). Я предлагаю вам переписать вашу деятельность, чтобы не использовать этих слушателей внутри onNewIntent(). Например, в большинстве случаев мои onNewIntent()методы просто выглядят так:

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // getIntent() should always return the most recent
    setIntent(intent);
}

Со всей логикой настройки, происходящей в onResume()использовании getIntent().


@Rodja, не могли бы вы прокомментировать этот stackoverflow.com/questions/19092631/… а также
Разработчик

3
Относящиеся к первоначальному вопросу: имейте в виду , если вы перемещаете код для обработки поиска Intentв onResume(), ваша активность, вероятно , попытается выполнить поиск каждый раз , когда оно возобновляется, вероятно , не поведение , которое вы хотите.
Тони Чан

1
Роджа говорит: С точки зрения жизненного цикла деятельности, поэтому необходимо вызывать onPause (), прежде чем onNewIntent () Android не НУЖНО проектировать его таким образом. Ваша активность уже прошла жизненный цикл, чтобы возобновить (). Нет необходимости для Android, чтобы вызвать onPause (), а затем снова вызвать onResume (). Если приложение возобновлено, ОС может просто вызвать onNewIntent () и остаться в возобновленном состоянии.
Сани Эльфишавы

Роджа говорит: С точки зрения жизненного цикла деятельности, поэтому необходимо вызывать onPause (), прежде чем onNewIntent () Android не ДОЛЖЕН разрабатывать его так. Ваша деятельность уже прошла жизненный цикл, чтобы возобновить. Если действие возобновляется, они могут просто вызвать onNewIntent () и остаться в возобновленном. Проблема с последовательностью Android состоит в том, что невозможно различить onPause из-за действий пользователя и onPause из-за фоновых намерений. Если вы хотите действовать в режиме onPause только в случае действий пользователя, вы облажались, потому что до будущего не будете знать, почему вы используете функцию onPause ().
Сани Эльфишавы

Важно отметить, что getIntent () по-прежнему возвращает исходный Intent. Вы можете использовать setIntent (Intent) для обновления до нового Intent.
linuxjava

15

Примечание. Вызов метода жизненного цикла из другого не является хорошей практикой. В приведенном ниже примере я попытался добиться того, чтобы ваш onNewIntent всегда вызывался независимо от типа вашей активности.

OnNewIntent () всегда вызывается для операций singleTop / Task, за исключением первого раза, когда создается действие. В это время вызывается onCreate, предоставляя решение для нескольких запросов, задаваемых в этой теме.

Вы можете вызывать onNewIntent всегда, помещая его в метод onCreate, например:

@Override
public void onCreate(Bundle savedState){
    super.onCreate(savedState);
    onNewIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  //code
}

59
Как правило, не стоит вызывать методы жизненного цикла напрямую, не так ли? Может быть, безвредный, или, может быть, какая-то базовая реализация onNewIntent () предполагает, что onPause () уже вызван? Предположительно безопаснее инкапсулировать код приложения в метод, вызываемый из обоих мест.
BernalKC

12
Согласовано. Мы столкнулись с несколькими крайними случаями, используя этот подход. Лучше всего избегать.
Саад Фарук

3
Да ... я тоже согласен избегать этого ... это было для тех, кто хочет вызывать onNewIntent и onCreate.
Паван Махешвари
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.