Androidのアプリケーション開発をしているとParcelableというものが出てきます。
Parcelableとは?
Androidにおけるシリアライズ、デシリアライズするためのインターフェースです。
Parcelableを実装することで、オブジェクトの状態を保持できます。つまり、値を受け渡しを可能にします。
どんなシナリオで使われるか?
アクティビティやフラグメントが一時停止したり再開する場合
onSaveInstanceStateおよびonRestoreInstanceStateメソッドでParcelableを使用してオブジェクトの状態を保存および復元します。
以下のような感じです。
private val SAVE_KEY = "save_key"
//保存する
override fun onSaveInstanceState(outState: Bundle) {
outState.putParcelable(SAVE_KEY, myDataObject)
super.onSaveInstanceState(outState)
}
//取得する
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
val restoredData = savedInstanceState.getParcelable<MyData>(SAVE_KEY)
}
あるアクティビティから別のアクティビティにデータを渡す場合
IntentにParcelableオブジェクトを添付することができます。
Fragment間でデータを受け渡す場合
Fragmentに対しても、同様にParcelableを使用して引数を渡すことができます。
画面の向きを回転させた場合
画面の向きを変えるとアクティビティが再生成される可能性があります。
このとき、アクティビティの状態を保存し、再生成後にそれを復元する必要があります。Parcelableは、アクティビティの再生成前にonSaveInstanceStateで状態を保存し、onCreateが呼び出されたタイミングで取得するような処理になると思います。
class MainActivity : AppCompatActivity() {
private var userData: UserData? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 画面が初めて作成された場合または再生成された場合
if (savedInstanceState == null) {
userData = UserData("John", 25)
} else {
// 画面の向きが変更されたときなど、再生成時に保存した状態を復元
userData = savedInstanceState.getParcelable("user_data")
}
// userDataを使用してUIを更新するなどの処理...
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
// 画面の向きが変更されたときなど、再生成時に復元するために状態を保存
outState.putParcelable("user_data", userData)
}
}