OnNewIntent() и зарегистрированные слушатели

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

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

  • начат диалог поиска
  • Цель поиска, запущенная для активности
  • onPause()
  • onNewIntent()
  • onResume()

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

Ответ 1

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

Ответ 2

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
}