web-dev-qa-db-ja.com

Androidで直接Intent putExtra()の代わりにBundleを使用する利点

私のAndroid=アプリケーションでは、常にIntentクラスのputExtra()関数を使用して、新しいActivityに任意の数の値を渡します。
このような:

_Intent i = new Intent(this, MyActivity.class);
i.putExtra(ID_EXTRA1, "1");
i.putExtra(ID_EXTRA2, "111");
startActivity(i);
_

AndroidでBundleについて知っています。そして、新しいBundleに値を渡すためにActivityを使用している人々を見てきました。
このような:

_Intent intent = new Intent(this, MyActivity.class);
Bundle extras = new Bundle();
extras.putString("EXTRA_USERNAME","my_username");
extras.putString("EXTRA_PASSWORD","my_password");
intent.putExtras(extras);
startActivity(intent);
_

ここで2つの疑問があります。
値を新しいBundleに直接渡すことでActivityに値を渡すことができる場合、なぜIntentを使用する必要がありますか?
直接BundleputExtra()の代わりにIntentを使用する利点は何ですか?

72
Vishal Vijay

違いはほとんどありません。追加のバンドルを使用するコードは、少し重く(実際のアプリケーションでは違いはありません)、管理がやや簡単で、より一般的です。

ある日、インテント内で情報を送信する前に、データベースにデータをシリアル化することを決定した場合、シリアル化できるバンドルを作成し、インテントに追加してからPendingBundleにフィードする方が少しきれいになります-すべて1つのオブジェクトで。

[更新]

明確化(他のいくつかの回答のため)。

エキストラis各Intentが運ぶ可能性のある追加のバンドル(必須ではありません)。したがって、バンドルを使用するか使用しないかの選択肢はありません。どちらの方法でもバンドルを使用しています。

初めてputExtraを使用すると、Intent内のmExtrasバンドルが初期化され、次のすべてのputExtraがそれに委任されます。バンドル自体にはアクセスできません(特定の種類のバグを回避するために設計されています)。

putExtras しないバンドルをIntent内に配置します。代わりに、現在のインテントバンドルにコピーします(または、putExtraと同様に作成します)。これがわずかに重い理由です(1つではなく2つのバンドルがあり、コピーの代価を支払う)。

重要なのは-putExtrasを使用する場合でも、インテント内の実際のバンドルにアクセスできないことです。しかし-あなたはあなたがそれでやりたいかもしれない何かのためのコピーを持っています。他のインテントにコピーするようにしてください(同様のインテントを多数送信する場合)。

61
fdreger

追加の利点:データがバンドルに入れられると、複数のインテントを介して同じデータを送信できます。 (その場合のみ、複数のインテントが送信されます)。

16
vanguard69

バンドルは、作成/読み取りをより簡単に分離できるため、UIのコードからバンドルを処理するコードを分離できるため、クールです。

ほとんどの場合、データの可能な限り少ない量(通常は文字列の数、id ...)を送信したいので役に立たない

6
njzk2

thisthis を参照できます。

1つのバンドルで複数または多数のデータを送信し、Intentを介して送信できます。または別の方法は、PutExtra()の複数のステートメントを追加することです。

そして、私の知る限りの重要な違いはありません。

5
Mahaveer Muttha