web-dev-qa-db-ja.com

LiveDataがonPause状態のActivityに通知するのはなぜですか?

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?
        });
    }
}

Observerアクティビティはすでにthis状態になっていますが、onPauseがまだトリガーされていることに戸惑いを感じます。 https://developer.Android.com/reference/Android/Arch/lifecycle/Lifecycle.State#STARTED によると

LifecycleOwnerの状態を開始しました。アクティビティの場合、次の2つの場合にこの状態になります。

after onStart call;
right before onPause call.

なぜそうなのか分かりますか?

9
Cheok Yan Cheng

LiveData リファレンスによると、

  1. LiveDataは、特定のライフサイクル内で監視できるデータホルダークラスです。これは、オブザーバーLifecycleOwnerとペアで追加できることを意味し、ペアのLifecycleOwnerがアクティブ状態の場合にのみ、ラップされたデータの変更についてこのオブザーバーに通知されます。 。 LifecycleOwnerは、その状態が[〜#〜]開始[〜#〜]または[〜#〜]再開[〜#〜]の場合、アクティブと見なされます。

  2. 対応するライフサイクルが[〜#〜] destroyed [〜#〜]状態に移行すると、ライフサイクルが追加されたオブザーバーは自動的に削除されます。

ここでの状況に応じて、LiveDataオブザーバー(アクティビティ)の更新をonPause()メソッドで受け取ります。これは、オブザーバーがまだにいないためです。 [〜#〜]破壊された[〜#〜]状態。

したがって、LiveDataは、次の方法に従って更新を受信するために引き続きアクティブです。

onActive()

アクティブなオブザーバーの数が0から1に変更されたときに呼び出されます。このコールバックは、このLiveDataが使用されていることを知るために使用できるため、最新の状態に保つ必要があります。

onInactive()

アクティブなオブザーバーの数が1から0に変更されたときに呼び出されます。これは、オブザーバーが残っていないことを意味するのではなく、オブザーバーが残っている可能性がありますが、ライフサイクル状態は開始または再開されません(アクティビティのように)バックスタック内)

hasObservers() でオブザーバーがいるかどうかを確認できます。


では、オブザーバー(あなたのアクティビティ)はいつ[〜#〜]破棄[〜#〜]状態になりますか?

LifeCycleOwnerのデフォルトの実装では、onDestroy()メソッドが実行された後、onPause()の逆の順序に従うと、アクティビティがDESTROYED状態になることを示します。ライフサイクル状態RESUMED-> STARTED-> CREATED-> DESTROYED

これを確認してください ライフサイクルグラフ

それが役に立てば幸い !

9
Jeel Vankhede

これは、onPauseとonStopがUIの副作用に関連している場合に明らかになります。アクティビティウィンドウのいずれかの部分がまだ表示されている場合、アクティビティは一時停止され、停止されません。これは、一時停止したアクティビティの上に別のアクティビティがダイアログとして表示されている場合に発生する可能性があります。この場合、開発者は、一時停止されたアクティビティのUIが部分的にしか表示されていなくても、引き続き更新されることを望んでいます。この一時停止状態でのLiveDataの更新は、それを行うのに役立ちます。

マルチウィンドウ機能のような他のケースがあります。ユーザーが別のウィンドウで別のアプリ/アクティビティを操作している間、1つのアクティビティを一時停止することができます。一時停止されたアクティビティは、アクティブな更新を伴うビデオ再生である可能性があり、ユーザーが別のアプリを操作している場合でも更新する必要があります。この実装は、複数のアクティビティ/ウィンドウが再開された状態になる可能性がある折りたたみ式電話のAndroid P)から変更されていることに注意してください(とにかくライブデータの更新の問題ではありません) https: //Android-developers.googleblog.com/2018/11/get-your-app-ready-for-foldable-phones.html

0
Vairavan