onNewIntent () жизненный цикл и зарегистрированные слушатели - PullRequest
132 голосов
/ 23 декабря 2011

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

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

  • Инициировано диалоговое окно поиска
  • Намерение поиска инициировано для действия
  • onPause()
  • onNewIntent()
  • onResume()

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

Ответы [ 2 ]

269 голосов
/ 17 января 2012

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().

13 голосов
/ 21 ноября 2012

Примечание. Вызов метода жизненного цикла из другого не является хорошей практикой.В приведенном ниже примере я попытался добиться того, чтобы ваш 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
}
...