[Android][Kotlin]Parcelableを生成してくれるライブラリ「Parceler」を使ってみた

2019.12.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Androidでは、Activity間でやりとりするデータにクラスを使いたいときはParcelableインターフェースの実装が必要です。ParcelerはParcelableのコードを生成してくれるOSSライブラリです。このライブラリを使えば大量のボイラープレートコードを書く必要がなくなります。

開発環境

Android Studio 3.5.3
Kotlin 1.3.61

手順

簡単な例としてメイン画面からサブ画面にデータを渡すまでの手順です。
1. アプリレベルのGradleに記述を追記する
2. クラスにParcelアノテーションを追加する
3. proguard-rules.proに記述を追記する
4. 呼び出し元でデータを設定する
5. 呼び出し先でデータを取得する

では、順番に解説していきます。

1. アプリレベルのGradleに追記する

アプリレベルのGradleに以下の記述を追加します。(Javaの場合は"kapt"が"annotationProcessor"になるので注意)

build.gradle

apply plugin: 'kotlin-kapt'
// 省略

dependencies {
    // 省略
    implementation 'org.parceler:parceler-api:1.1.12'
    kapt 'org.parceler:parceler:1.1.12'
}

2. クラスにParcelアノテーションを追加する

クラスにParcelアノテーションを追加します。今回はFoobaaというクラスを作成しました。Kotlinで使用するときは@Parcel(Parcel.Serialization.BEAN)を全て記述する必要があります。

Foobaa.kt

import org.parceler.Parcel

@Parcel(Parcel.Serialization.BEAN)
class Foobaa(var id: Long = 0, var foo: String? = null, var baa: String? = null)

3. 呼び出し元でデータを設定する

FoobaaをParcelableに変換してIntentに設定し、サブ画面を呼び出します。Parcels.wrap()を使ってFoobaaクラスをParcelableに変換します。

MainActivity.kt

import org.parceler.Parcel

// 省略

val foobaa = Foobaa(0, "foo", "baa")
val intent = Intent(this, SubActivity::class.java).apply {
    // Parcelableに変換
    putExtra("foobaa", Parcels.wrap(foobaa))
}
startActivity(intent)

4. 呼び出し先でデータを取得する

受け取ったIntentからParcelableを取得し、Parcels.unwrap()を使ってFoobaaクラスに戻します。

SubActivity.kt

import org.parceler.Parcel

// 省略
// Foobaaクラス戻す
val foobaa = Parcels.unwrap<Foobaa>(intent.getParcelableExtra("foobaa"))
Log.d(TAG, "id: ${foobaa.id} foo: ${foobaa.foo} baa: ${foobaa.baa}")

5. proguard-rules.proに追記する

Proguradの設定に以下の内容を追記します。旧バージョンから最新バージョンへのアップデートをする方は記述内容が変更になったので注意してください。あるプロジェクトでParcelerのバージョンアップをおこなったのですが、ProGuardの修正が抜けていたため本番環境だけで発生する不具合が発生しました。

proguard-rules.pro

# Parceler library
-keep interface org.parceler.Parcel
-keep @org.parceler.Parcel class * { *; }
-keep class **$$Parcelable { *; }

まとめ

OSSのParcelerを紹介しましたが、KotlinにはParcelizeアノテーションを使う方法もあるので興味のある方はそちらも試してみてください。

参考