現在MVVMのアーキテクチャパターンについて研究していますが、BaseObservableを拡張するカスタムViewModelクラスと、Android自体によって提供される別のViewModelとの間で混乱しました。
カスタムViewModelは単にビューのデータホルダーであり、ビューにバインドされているため(そしてObservableオブジェクトであるため)、データの変更についてビューに通知できます。ただし、向きの変更(ビューの回転)などの構成変更は認識されないため、このような場合、プログラマはデータを保存して復元する必要があります ここの例 。
一方、Android=によって提供されるViewModelはこれらの構成変更を認識しているため、そのデータはアクティビティのライフサイクル全体で一貫しています。ViewModelはアクティビティが破棄されると破棄されます。
ViewModel()スーパークラスとAndroidViewModel()スーパークラスの主な違いは、AndroidViewModel()がアプリケーションのコンテキストへの参照(アクティビティコンテキスト自体ではない)を持っていることです。
アクティビティは、(電話の回転など)構成が変更されたときに破棄され、再作成されることになっています。したがって、メモリリーク(破壊されたアクティビティへの参照)が発生する傾向があるため、ViewModelにコンテキストを渡すことはお勧めできません。
ViewModelはこれらの構成変更に耐えることを目的としていますが、ViewModel()はContextへの参照を持ちません。
一方、AndroidViewModel()にはアプリケーション(特別なタイプのコンテキスト)の参照があるため、packageManagerなどのアプリケーション固有の情報にアクセスできます。
class MyViewModel(application: Application) : AndroidViewModel(application)