J'utilise une activité singleTop pour recevoir des informations à partir d'un dialogue de recherche via onNewIntent()
.
Ce que j'ai remarqué, c'est que onPause()
est appelé avant onNewIntent()
, puis il appelle onResume()
. Visuellement:
onPause()
onNewIntent()
onResume()
Le problème est que j'ai des écouteurs enregistrés dans onResume()
qui sont supprimés dans onPause()
, mais ils sont nécessaires à l'intérieur de l'appel onNewIntent()
. Existe-t-il un moyen standard de rendre ces auditeurs disponibles?
onNewIntent()
est conçu comme point d'entrée pour les activités singleTop qui s'exécutent déjà ailleurs dans la pile et ne peuvent donc pas appeler onCreate()
. Du point de vue du cycle de vie des activités, il est donc nécessaire d’appeler onPause()
avant onNewIntent()
. Je vous suggère de réécrire votre activité pour ne pas utiliser ces écouteurs à l'intérieur de onNewIntent()
. Par exemple, la plupart du temps, mes méthodes onNewIntent()
ressemblent simplement à ceci:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// getIntent() should always return the most recent
setIntent(intent);
}
Avec toute la logique de configuration se produisant dans onResume()
en utilisant getIntent()
.
Remarque: appeler une méthode de cycle de vie à partir d'une autre méthode n'est pas une bonne pratique. Dans l'exemple ci-dessous, j'ai essayé d'obtenir que votre onNewIntent soit toujours appelé, quel que soit votre type d'activité.
OnNewIntent () est toujours appelé pour les activités singleTop/Task sauf la première fois que l'activité est créée. À ce moment-là, onCreate s'appelle fournir à solution pour quelques requêtes posées sur ce fil.
Vous pouvez toujours invoquer onNewIntent en le mettant dans la méthode onCreate telle que
@Override
public void onCreate(Bundle savedState){
super.onCreate(savedState);
onNewIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
//code
}