onNewIntent() lifecycle and registered listeners

DJayC picture DJayC · Dec 23, 2011 · Viewed 99.8k times · Source

I'm using a singleTop Activity to receive intents from a search-dialog via onNewIntent().

What I noticed is that onPause() is called before onNewIntent(), and then afterwards it calls onResume(). Visually:

  • search dialog initiated
  • search intent fired to activity
  • onPause()
  • onNewIntent()
  • onResume()

The problem is that I have listeners registered in onResume() that get removed in onPause(), but they are needed inside of the onNewIntent() call. Is there a standard way to make those listeners available?

Answer

Rodja picture Rodja · Jan 17, 2012

onNewIntent() is meant as entry point for singleTop activities which already run somewhere else in the stack and therefore can't call onCreate(). From activities lifecycle point of view it's therefore needed to call onPause() before onNewIntent(). I suggest you to rewrite your activity to not use these listeners inside of onNewIntent(). For example most of the time my onNewIntent() methods simply looks like this:

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

With all setup logic happening in onResume() by utilizing getIntent().