Jetpack Composeにおいてカスタムデータクラスに Parcelable を付与する最大の効果は、画面回転やプロセス破棄(バックグラウンド移行時のメモリ解放など)が発生しても、UIの複雑な状態を完全に復元できるようになることです。
通常、Composeでは rememberSaveable を使って状態を保存しますが、プリミティブ型(StringやIntなど)以外の独自クラスを保存しようとするとエラーになります。Parcelable を実装(または @Parcelize を付与)することで、Composeがそのオブジェクトを Bundle に変換してシリアライズできるようになります。
💡 Parcelable 付与による具体的なメリット
rememberSaveableでの独自クラスの保存- 画面回転やシステムのプロセス終了をまたいで、カスタムオブジェクトの状態を維持できます。
- Navigationでの画面間データ遷移(Type-Safe Navigation)
- Jetpack Composeの公式 Navigation レシピ にもある通り、画面間でオブジェクト型の引数を安全に受け渡すことが可能になります。
- ViewModel(
SavedStateHandle)とのシームレスな連携- コンポーザブル階層の外側にある
SavedStateHandleに直接データを格納し、プロセスの再起動に対応できます。
- コンポーザブル階層の外側にある
- 高速なシリアライズ処理
- Java標準の
Serializableよりも Android 用に最適化されているため、メモリやCPUの消費を抑えて高速に動作します。
- Java標準の
🛠️ 実装例(@Parcelize アノテーションの利用)
Kotlinでは、kotlinx-parcelize プラグインを使うことで、ボイラープレートコード(定型文)を書かずに @Parcelize アノテーションを付与するだけで自動生成できます。
import android.os.Parcelable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import kotlinx.parcelize.Parcelize
// 1. Parcelableを実装し、@Parcelizeを付与する
@Parcelize
data class UserProfile(
val name: String,
val age: Int
) : Parcelable
@Composable
fun ProfileScreen() {
// 2. rememberSaveableでそのまま保持できるようになる
var user by rememberSaveable { mutableStateOf(UserProfile("桃太郎", 20)) }
}
⚠️ 注意点
Parcelable(Bundle)に保存できるデータ容量には約1MBの制限があります。画像データや巨大なリスト、データベースのキャッシュなどをそのまま Parcelable にして保持しようとすると、TransactionTooLargeExceptionエラーでアプリがクラッシュする原因になるため、IDや軽量なステータスのみを保持するようにしてください。