Parcelable と Bundle

Parcelable オブジェクトと Bundle オブジェクトは、 IPC/Binder など、プロセスの境界を越えて使用 トランザクション、インテントとアクティビティ間のトランザクション、構成全体での一時的な状態の保存などの機能を利用できます。 できます。このページでは、Terraform の使用に関する推奨事項とベスト プラクティスについて説明します。 Parcelable オブジェクトと Bundle オブジェクト。

注: Parcel は汎用ではありません。 シリアライゼーション メカニズムであるため、 Parcel データをディスクに保存するか、ネットワーク経由で送信します。

アクティビティ間でデータを送信する

アプリが Cloud Storage で使用する Intent オブジェクトを 新しい Activity を開始する際に startActivity(android.content.Intent) アプリは パラメータ(putExtra(java.lang.String, java.lang.String) を使用) メソッドを呼び出します。

次のコード スニペットに、この処理を実行する方法の例を示します。

Kotlin

val intent = Intent(this, MyActivity::class.java).apply {
    putExtra("media_id", "a1b2c3")
    // ...
}
startActivity(intent)

Java

Intent intent = new Intent(this, MyActivity.class);
intent.putExtra("media_id", "a1b2c3");
// ...
startActivity(intent);

OS は、インテントの基となる Bundle をパーセル化します。その後、OS は 新しいアクティビティ データのパーセルを解除し、インテントを新しいアクティビティに渡します。

Bundle クラスを使用して、OS が認識しているプリミティブを設定することをおすすめします。 Intent オブジェクト。Bundle クラスは、 パーセルを使用したマーシャリングとアンマーシャリングに最適化されています。

場合によっては、複合オブジェクトまたは複合オブジェクトをアクティビティ間で送信するメカニズムが必要になることがあります。 このような場合、カスタムクラスで Parcelable を実装し、 writeToParcel(android.os.Parcel, int) メソッドを使用します。 また、null ではない CREATOR フィールドも用意する必要があります。 Parcelable.Creator インターフェースを実装します。このインターフェース createFromParcel() メソッドは、Parcel を現在のオブジェクトに戻すために使用されます。 詳しくは Parcelable オブジェクトのリファレンス ドキュメントをご覧ください。

インテントを介してデータを送信する場合は、データサイズを数 KB に制限するよう注意する必要があります。 送信するデータが多すぎると、システムから TransactionTooLargeException 例外。

プロセス間でデータを送信する

プロセス間でデータを送信する方法は、アクティビティ間で行う方法と似ています。ただし、 カスタム Parcelable は使用しないことをおすすめします。カスタムの Parcelable オブジェクトをアプリから別のアプリに転送するには、そのアプリが カスタムクラスとまったく同じバージョンの 送信側のアプリと受信側のアプリの両方に存在します。通常、これは共通ライブラリ 使用しています。アプリがカスタム Parcelable を これは、システムが認識していないクラスをアンマーシャリングできないためです。

たとえば、アプリでのアラームの設定には、 AlarmManager クラスを使用し、カスタムの Parcelable を使用する 定義しますアラームが鳴ると、システムはインテントの 追加する特典の Bundle 繰り返し回数を表します。この変更により、システムでカスタム バックエンドが削除され、 エクストラの Parcelable。その結果、アプリの 変更されたアラーム インテントを受け取ると、アプリがクラッシュする 存在しないデータを受信できます

Binder トランザクション バッファには、現在 1 MB の固定サイズが限られており、 処理中のトランザクションを検出できますこのプロセスでは 場合、これらのトランザクションには、すべてのバインダー トランザクションが onSaveInstanceState、startActivity、システムとのやり取りなどのアプリに関する操作。サイズが 制限を超えると、TransactionTooLargeException がスローされます。

savedInstanceState の特定のケースでは、データの量を小さくする必要があります。 これは、提供されたデータを、ユーザーが そのアクティビティに戻ることができる(アクティビティのプロセスが強制終了された場合でも) 保存済み状態は 5 万未満のデータに保つことをおすすめします。

注: Android 7.0(API レベル 24)以降では、システムは TransactionTooLargeException がランタイム例外として発生しました。 それより前のバージョンの Android では、logcat に警告のみが表示されます。