6 月 3 日の「#Android11: The Beta Launch Show」にぜひご参加ください。

ViewModel の保存済み状態モジュール(Android Jetpack の一部

UI の状態の保存に関する記事で説明したように、ViewModel オブジェクトでは設定の変更を処理できるため、回転などの状態を心配する必要がありません。ただし、システムによって開始されたプロセスの終了を処理する必要がある場合は、onSaveInstanceState() をバックアップとして使用できます。

UI の状態は、通常、アクティビティではなく ViewModel オブジェクトに保存されるか、このオブジェクトで参照されます。したがって、onSaveInstanceState() を使用するには、このモジュールで処理できるボイラープレートが必要です。

モジュールがセットアップされると、ViewModel オブジェクトはそのコンストラクタを介して SavedStateHandle オブジェクトを受け取ります。これは、保存済み状態との間でオブジェクトの書き込みや取得を行えるようにする Key-Value マップです。これらの値は、システムによってプロセスが強制終了された後も保持され、同じオブジェクトを介して引き続き使用できます。

セットアップと使用

Fragment 1.2.0 またはその推移的依存関係の Activity 1.1.0 を使用する場合、ViewModel インスタンスのデフォルト ファクトリでは、追加の設定なしに適切な SavedStateHandleViewModel に渡せます。

Kotlin

    // Use the Kotlin property extension in the fragment-ktx / activity-ktx artifacts
    val vm: SavedStateViewModel by viewModels()

    

Java

    SavedStateViewModel vm = new ViewModelProvider(this)
            .get(SavedStateViewModel.class);
    

その後、ViewModel には、SavedStateHandle を受け取るコンストラクタを含めることができます。

Kotlin

    class SavedStateViewModel(private val state: SavedStateHandle) : ViewModel() { ... }
    

Java


    public class SavedStateViewModel extends ViewModel {
        private SavedStateHandle mState;

        public SavedStateViewModel(SavedStateHandle savedStateHandle) {
            mState = savedStateHandle;
        }
        ...
    }
    

カスタム ViewModelProvider.Factory インスタンスを提供する場合、AbstractSavedStateViewModelFactory を拡張することによって SavedStateHandle の使用を有効にできます。

値の保存と取得

SavedStateHandle クラスには、Key-Value マップに必要なメソッドがあります。

  • get(String key)
  • contains(String key)
  • remove(String key)
  • set(String key, T value)
  • keys()

また、監視可能な LiveData にラップされた値を返す特別なメソッド getLiveData(String key) もあります。

利用可能なクラス

タイプ / クラス 配列のサポート
double double[]
int int[]
long long[]
String String[]
byte byte[]
char char[]
CharSequence CharSequence[]
float float[]
Parcelable Parcelable[]
Serializable Serializable[]
short short[]
SparseArray
Binder
Bundle
ArrayList
Size (only in API 21+)
SizeF (only in API 21+)

参考情報

ViewModel の保存済み状態モジュールの詳細については、以下のリソースをご覧ください。

コードラボ