onNewIntent () ciclo de vida y oyentes registrados

150

Estoy usando una actividad TopTop para recibir intentos de un diálogo de búsqueda a través de onNewIntent().

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

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

El problema es que tengo oyentes registrados onResume()que se eliminan onPause(), pero son necesarios dentro de la onNewIntent()llamada. ¿Existe una forma estándar de hacer que esos oyentes estén disponibles?

DJayC
fuente

Respuestas:

294

onNewIntent()se entiende como punto de entrada para actividades singleTop que ya se ejecutan en otro lugar de la pila y, por lo tanto, no pueden llamar onCreate(). Desde el punto de vista del ciclo de vida de las actividades, es necesario llamar onPause()antes 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 ven así:

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

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

Rodja
fuente
@Rodja, ¿podría comentar sobre este stackoverflow.com/questions/19092631/… también
Desarrollador el
3
Relacionada con la pregunta original: tener en cuenta si se mueve el código de manejar la búsqueda Intenten onResume(), su actividad probablemente tratará de ejecutar una búsqueda cada vez que se reanude, probablemente no es el comportamiento que desea.
Tony Chan
1
Rodja dice: Desde el punto de vista del ciclo de vida de las actividades, por lo tanto, es necesario llamar a onPause () antes de que onNewIntent () Android NO NECESITA diseñarlo de esta manera. Su actividad ya ha pasado por su ciclo de vida hasta reanudar (). No es NECESARIO que Android llame a onPause () y luego llame a onResume () nuevamente. Si se reanuda la aplicación, el sistema operativo simplemente podría llamar a NewIntent () y permanecer en el estado reanudado.
Sani Elfishawy
Rodja dice: Desde el punto de vista del ciclo de vida de las actividades, por lo tanto, es necesario llamar a onPause () antes de que onNewIntent () Android NO NECESITA diseñarlo así. Su actividad ya ha pasado por su ciclo de vida para reanudarse. Si se reanuda el acto, simplemente pueden llamar a NewIntent () y permanecer en el reanudado. El problema con la secuencia de Android es que hace que sea imposible distinguir entre onPause debido a la acción del usuario y onPause debido a una intención de fondo. Si desea actuar onPause solo en el caso de la acción del usuario, está jodido porque no sabrá hasta el futuro por qué usa onPause ().
Sani Elfishawy
Un punto importante a tener en cuenta es que getIntent () aún devuelve la intención original. Puede usar setIntent (Intent) para actualizar al nuevo Intent.
linuxjava
15

Nota: Llamar a un método de ciclo de vida desde otro no es una buena práctica. En el siguiente ejemplo, traté de lograr que tu onNewIntent siempre se llame independientemente de tu tipo de actividad.

OnNewIntent () siempre recibe llamadas para actividades SingleTop / Task, excepto por primera vez cuando se crea la actividad. En ese momento, se llama a onCreate que proporciona una solución para algunas consultas realizadas en este hilo.

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
}
Pawan Maheshwari
fuente
59
En general, no es una buena idea llamar directamente a los métodos del ciclo de vida, ¿no? ¿Tal vez inofensivo, o tal vez alguna implementación básica de onNewIntent () asume que onPause () ya ha sido llamado? Presumiblemente más seguro encapsular el código de la aplicación en un método invocable desde ambos lugares.
BernalKC
12
Convenido. Nos encontramos con algunos casos extremos utilizando este enfoque. Es mejor evitarlo.
Saad Farooq
3
Sí ... yo también estoy de acuerdo en evitar esto ... esto fue para aquellos que también quieren invocar a NewIntent de onCreate.
Pawan Maheshwari