2011-12-23 25 views
113

Estoy usando una sola actividad superior para recibir intentos desde un cuadro de diálogo de búsqueda a través de onNewIntent().onNewIntent() ciclo de vida y oyentes registrados

Lo que noté es que onPause() se llama antes de onNewIntent(), y luego llama al onResume(). Visualmente:

  • diálogo de búsqueda inició
  • intención de búsqueda disparó a la actividad
  • onPause()
  • onNewIntent()
  • onResume()

El problema es que tengo los detectores registrados en onResume() que fueron borrados en onPause(), pero son n ingresado dentro de la llamada onNewIntent(). ¿Hay una forma estándar de hacer que esos oyentes estén disponibles?

Respuesta

213

onNewIntent() se entiende como punto de entrada para actividades singleTop que ya se ejecutan en otro lugar en la pila y, por lo tanto, no pueden llamar al onCreate(). Desde el punto de vista del ciclo de vida de las actividades, es necesario llamar al onPause() antes del onNewIntent(). Le sugiero que reescriba su actividad para no usar estos oyentes dentro de onNewIntent(). Por ejemplo la mayoría de las veces mis onNewIntent() métodos simplemente se ve así:

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

Con toda lógica configuración sucediendo en onResume() mediante la utilización de getIntent().

+0

@Rodja haga el favor de comentar en este http://stackoverflow.com/questions/19092631/logout-from-the-application- android/19092683? noredirect = 1 # 19092683 también – Developer

+0

Relacionado con la pregunta original: tenga en cuenta que si mueve el código para manejar la búsqueda 'Intent' en' onResume() ', su actividad probablemente intente ejecutar una búsqueda cada vez que se reanuda, probablemente no es el comportamiento que desea. –

+0

Rodja dice: Desde el punto de vista del ciclo de vida de las actividades, por lo tanto, es necesario llamar a OnPause() antes de onNewIntent() Android NECESITÓ diseñarlo de esta manera. Su actividad ya ha pasado por su ciclo de vida hasta resumir(). No es NECESARIO que android llame a OnPause() y luego vuelva a llamar a Reesume(). Si la aplicación se reanuda, el sistema operativo simplemente podría llamar aNewIntent() y permanecer en el estado reanudado. –

13

OnNewIntent() siempre recibe un llamado para las actividades SingleTop/Task, excepto por primera vez cuando se crea la actividad. En ese momento se llama onCreate.

Puede invocar onNewIntent siempre poniéndolo en el método onCreate como

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

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

En general, no es una buena idea llamar directamente a los métodos del ciclo de vida, ¿no? Tal vez inofensivo, o tal vez una implementación base de onNewIntent() asuma que ya se ha llamado a onPause()? Presumiblemente más seguro para encapsular el código de la aplicación en un método que se puede llamar desde ambos lugares. – BernalKC

+10

De acuerdo. Nos encontramos con algunos casos extremos utilizando este enfoque. Mejor evitado –

+2

Sí ... yo también estoy de acuerdo en evitar esto ... esto fue para aquellos que quieren invocar a NewIntent desde onCreate también. –

Cuestiones relacionadas