AndroidX SavedState

Kenji Abe

Android Advent Calendar 2018 の25日目の記事です。

先日リリースされたばかりの androidx.savedstate についてです。

このSavedStateだけでは使い所が難しいですが、これと同時にリリースされた、androidx.activityandroidx.fragment に含まれており、これを使うことでちょっと便利になることがあります。

何をしてくれるのか?

Activity/Fragmentが再生成されたときの、データの保存とデータの復元をしてくれます。

普段なら、再生成される際のデータ保存を、 onSaveInstanceState をオーバーライドして、このメソッド内で保存処理をすると思います。

このデータ保存を onSaveInstanceState ではなく、コールバックの形式で提供してくれます。

build.gradle

これ書いてる段階ではappcompatのほうに含まれてなかったので、明示的に指定してます。とりあえず、Activityのみで。

implementation "androidx.activity:activity:1.0.0-alpha03"

実装方法 (in AppCompatActivity)

1.1.0-alpha03 からgetBundleSavedStateRegistry メソッドが追加されてます。これがandroidx.savedstateのクラスを返すようになってるので、これを使います。

データ保存

データの保存したい箇所で、 bundleSavedStateRegistry#registerSavedStateProvider を使います。 onSaveInstanceState 内じゃなくても大丈夫です。

第一引数に、キーを指定して、第二引数にBundleのインスタンスを返すラムダ式を返します。このラムダ式が onSaveInstanceState が実行されるタイミングで呼び出され、このBundleのインスタンスが保存されることになります。

データ取得

次にデータ取得です。データ取得も好きなところ(onCreate以降)で、 bundleSavedStateRegistry.consumeRestoredStateForKey で保存したときのキーを指定してBundleを取り出すことができます。

注意点

使うときの注意点です。

consumeRestoredStateForKey でデータを取り出すときは BundleSavedStateRegistryperformRestore が呼び出されている必要があります。
このあたりは ComponentActivity がonCreateでやってくれてるので、気にする必要は無いのですが、例えば、データ保存してActivityの再生成が行われる前にデータ取得しようとしても取得できません。

もう一点注意ですが、これはメソッド名を見ればなんとなく分かると思いますが、一度 consumeRestoredStateForKey でデータを取得した場合は、二回目以降はnullが返却されます。
再び取得可能になるには、 registerSavedStateProvider で保存して、 performRestore が呼び出されてからになります。

まとめ

必要な箇所で、bundleSavedStateRegistry#registerSavedStateProvider をやっておけば自動で保存してくれるのは便利かも。

参考

最後に

メリークリスマス🎄 and 良いお年を 👋

Kenji Abe

Written by

Kenji Abe

Programmer / Gamer

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade