71046


> The ViewModel class is designed to store and manage UI-related data in a
> lifecycle conscious way. The ViewModel class allows data to survive
> configuration changes such as screen rotations.

<https://developer.android.com/topic/libraries/architecture/viewmodel> より

とあります。  
ViewModelを利用する動機の一つとして、rotateで起こるActivity再生成を超えてModelを保持できることがあるそうです。  
私はこれがどのようにもたらされるのか、そして「であるならばViewModelのライフサイクルはどれくらい長いのか」を調べました。

  * <https://developer.android.com/reference/android/arch/lifecycle/ViewModelProvider>
  * <https://developer.android.com/reference/androidx/lifecycle/ViewModelProvider#ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner)>
  * <https://developer.android.com/reference/androidx/lifecycle/ViewModelStoreOwner>

このあたりのドキュメントを参考にしたところ、

  * Activityは直接ViewModelを保持しているわけではなく、ViewModelProvierによってもたらされる
  * ViewModelProviderは指定されたViewModelStoreOwnerを用いてViewModelをStoreする
  * ViewModelStoreOwnerをImplementsしているのは結局Activityである

ということがわかりました。  
であるならば、つまるところ、Activityが直接ViewModelを保持しているのとかわりはなく、ライフサイクルの面では何の意味もないアーキテクチャに思えます。

表題の質問に戻りますが、Activityの再生成を超えてデータを保持できる理由もわかりません。  
なぜなのでしょうか


CC BY-SA 4.0
2020-10-09T12:54:27.340
71045
2020-10-09T12:54:27.340
427
question
android
なぜViewModelはrotateによるAcitivityの再生成を超えてデータを保持できるのか


自己解決したので書きます。

rotateではActivityのdestroyとcreateを呼びはするが、Activityインスタンス自体は破棄しないからです。  
つまりそもそもActivityがフィールドとして保持している値はrotateを超えて破棄されません。(onCreateで値をフォーマットしてしまわない限り！)  
そのActivityをViewModelStoreOwnerとして実行されるViewModelProviderも同様です。

もし仮にrotateがActivityのインスタンスを破棄"することもある"のであれば、この枠組で取り上げているViewModelも同様に破棄されます。(そのためにsavedStateという機能があります)

* * *

このことは、そもそもActivityにデータ保持させるために、onCreateではなく、constructorで初期化をすれば、同様の効果を得られることを示していると思います。


CC BY-SA 4.0
2020-10-09T12:54:27.340
71046
2020-10-09T12:54:27.340
427
71045
answer