J'ai le code suivant dans Activity
@Override
public void onPause() {
super.onPause();
if (isFinishing()) {
final LiveData<StickyNoteConfig> stickyNoteConfigLiveData = StickyNoteConfigRepository.INSTANCE.getStickyNoteConfig(mAppWidgetId);
stickyNoteConfigLiveData.removeObservers(this);
stickyNoteConfigLiveData.observe(this, stickyNoteConfig -> {
// Weird, I still can receive call back.
// I thought "this" is no longer active?
});
}
}
Je suis perplexe de savoir que Observer
est toujours en cours de déclenchement, bien que l'activité this
soit déjà dans l'état onPause
? Selon https://developer.Android.com/reference/Android/Arch/lifecycle/Lifecycle.State#STARTED
Etat lancé pour un LifecycleOwner. Pour une activité, cet état est atteint dans deux cas:
after onStart call; right before onPause call.
Puis-je savoir pourquoi il en est ainsi?
Selon la référence LiveData ,
LiveData
est une classe de détenteur de données pouvant être observée au cours d'un cycle de vie donné. Cela signifie qu'un Observer peut être ajouté dans une paire Avec unLifecycleOwner
, et cet observateur sera informé des modifications de Des données encapsulées uniquement si laLifecycleOwner
est à l'état actif.LifecycleOwner
est considéré comme actif si son état estCOMMENC&EACUTE;ouREPRIS.Un observateur ajouté avec un cycle de vie sera automatiquement supprimé si le cycle de vie correspondant passe àD&EACUTE;TRUITétat.
Maintenant, selon votre situation ici, LiveData
reçoit des mises à jour pour votre méthode observateur (votre activité) dansonPause()
, car votre observateur n'est pas déjà dansD&EACUTE;TRUITEtat.
Donc, LiveData est toujours actif pour recevoir des mises à jour selon ces méthodes:
Appelé lorsque le nombre d'observateurs actifs passe de 0 à 1. Ce rappel peut être utilisé pour savoir que cette LiveData est utilisée et doit donc être mise à jour.
Et
Appelée lorsque le nombre d'observateurs actifs passe de 1 à 0. Cela ne signifie pas qu'il n'y a plus d'observateurs, il peut rester des observateurs mais leurs états de cycle de vie ne sont pas STARTED ou RESUMED (comme une activité dans la pile arrière). ).
Vous pouvez vérifier s'il y a des observateurs via hasObservers () .
Alors, quand observateur (votre activité) obtientD&EACUTE;TRUITétat?
Pour l'implémentation par défaut de LifeCycleOwner
indique que l'activité obtient son état DESTROYED une fois queonDestroy()
la méthode est exécutée & aprèsonPause()
suit l'ordre inverse de l'état de LifeCycle RESUMED -> DÉMARRÉ -> CRÉÉ - > Détruit.
Vérifiez ce graphique cycle de vie .
J'espère que ça aide !
Cela devient évident quand onPause et onStop sont liés aux effets secondaires de l'interface utilisateur. Une activité est suspendue et non arrêtée si une partie de la fenêtre d'activité est toujours visible. Cela peut se produire lorsqu'une autre activité est affichée en haut de l'activité en pause sous la forme d'un dialogue. Dans ce cas, le plus souvent, les développeurs souhaitent que l'interface utilisateur de l'activité suspendue soit toujours mise à jour, même si elle n'est que partiellement visible. La mise à jour de LiveData dans cet état de pause permet de le faire.
Il existe d'autres cas tels que la fonctionnalité multi-fenêtre. Une activité peut être suspendue pendant que l'utilisateur interagit avec une autre application/activité dans une fenêtre différente. L'activité suspendue pourrait être une lecture vidéo avec des mises à jour actives et devrait être mise à jour même si l'utilisateur interagit avec une autre application. Notez que cette implémentation est en train de changer depuis Android P pour les téléphones pliables dans lesquels plusieurs activités/fenêtres pourraient être à l'état de reprise (ce n'est pas le problème des mises à jour de données en temps réel). https://Android-developers.googleblog.com/2018/11/get-your-app-ready-for-foldable-phones.html