1. ホーム
  2. android

[解決済み] AndroidでIntent putExtra()を直接使う代わりにBundleを使う利点

2023-07-14 23:18:16

質問

私のアンドロイドアプリケーションでは、常にダイレクトに putExtra() の関数を使用しています。 Intent クラスで、任意の数の値を新しい Activity .

このように

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

について知っている 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 ?

を使用する利点は何ですか? Bundle の代わりに、直接 Intent putExtra() ?

どのように解決するのですか?

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

ある日、インテント内で情報を送信する前に、データをデータベースにシリアライズすることを決めた場合、シリアライズしてインテントに追加し、PendingBundle に供給できるバンドルを持つことは、少しすっきりします - すべて 1 つのオブジェクトで。

[更新]

明確化(他の回答があったため)。

番外編 は、各インテントが運ぶかもしれない(しかし運ぶ必要はない)追加のバンドルで、バンドルを使用するか使用しないかの選択肢はありません。どちらにしてもバンドルを使用していることになります。

を使用するのは putExtra , a mExtras のような Intent 内のバンドルが初期化され、それ以降の putExtra は全てそれに委ねられます。バンドル自体にはアクセスできません(これは、ある種のバグを避けるための設計です)。

putExtras はしません。 は、バンドルをインテントの中に入れます。代わりに、現在のインテント・バンドルにコピーします (または、次のように作成します。 putExtra ). このため、若干重くなります(1つのバンドルではなく2つのバンドルがあり、コピーの代償を払うことになります)。

肝心なのは、もしあなたが putExtras を使用した場合、インテント内の実際のバンドルにアクセスすることはできません。しかし、そのバンドルでやりたいことのためにコピーを取っておくことができます。たとえば、別のインテントにコピーしておくことができます (同様のインテントを大量に送信する場合)。