1. ホーム
  2. android

ビューモデルのonClearedはいつ呼び出されるのですか?

2023-10-29 23:02:26

質問

ViewModels はアクティビティ/フラグメントのライフサイクルに依存しないのでしょうか、それとも構成の変更だけなのでしょうか。いつ存在しなくなり、その後のonCleared()メソッドが呼び出されるのでしょうか。 ビューモデルは他のアクティビティと共有できますか?

状況です。

Activity1+viewModel1--->(rotation)--->Activity1+viewModel1
--->(launch Intent)--->Activity2+viewModel1

この共有は可能ですか、そしてそれは良い習慣ですか。

また、アプリのライフサイクルのコールバック、onPause->onStop->onDestroyは両者とも同じものなので

1.アクティビティが回転するのと

2.アクティビティが終了するとき

ViewModelはどのようにしてonClearedを呼び出し、最終的にそのライフサイクルを終了する適切なタイミングを内部的に把握しているのでしょうか。


検索 :

ViewModel は内部で holderFragment を使用してアクティビティのインスタンスを保持し、設定の変更を考慮するためにフラグメントのような setRetainInstance メソッドを使用します。

ソースはこちら dive-inside-of-androids-viewmodel-architecture-components (日本語)

どのように解決するのですか?

<ブロッククオート

ViewModels は、アクティビティやフラグメントのライフサイクルに依存しないのでしょうか? 構成が変更されるだけです。

ViewModels (VM) は設定の変更から独立しており、アクティビティ/フラグメントが破棄されるとクリアされます。

以下は ViewModel のライフサイクルです。 を公式サイトから引用しています。

viewModelは他のActivityと共有できますか?

アクティビティでそれを行うべきではありません。しかし、フラグメントは ViewModel を共有し、アクティビティスコープを使用してフラグメント間の通信を処理することができます。

ViewModel はどのようにして、内部的に適切なタイミングで onCleared を呼び出し、最終的にそのライフサイクルを終了させるための適切なタイミングを内部的にどのように把握するのでしょうか?

VMの onCleared は、アプリがバックグラウンドに置かれたときに呼び出され、システムのメモリを解放するためにアプリのプロセスを終了させます。

を参照してください。 ViewModelsは私のデータを持続させますか? のセクションを参照してください。 ViewModels。永続化、onSaveInstanceState()、UI状態の復元とローダー

ユーザーがアプリをバックグラウンドに置いて、3時間後にまったく同じ状態で戻ってこられるようにしたい場合、データも永続化する必要があります。これは、アクティビティがバックグラウンドに入るとすぐに、デバイスのメモリが不足している場合、アプリのプロセスを停止できるためです。

アプリプロセスとアクティビティが停止されると、ViewModelもクリアされます。