web-dev-qa-db-fra.com

Cycle de vie onNewIntent () et auditeurs enregistrés

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:

  • dialogue de recherche lancé
  • intention de recherche renvoyée à l'activité
  • 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?

136
DJayC

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

273
Rodja

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
}
14
Pawan Maheshwari