Androidアプリケーションの「バンドル」とは


回答:


278

バンドルは通常、さまざまなAndroidアクティビティ間でデータを受け渡すために使用されます。渡す値のタイプはユーザーによって異なりますが、バンドルはすべてのタイプの値を保持して新しいアクティビティに渡すことができます。

次のように使用できます。

Intent intent = new...
Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("myKey", AnyValue);  
startActivity(intent);

次のようにして、渡された値を取得できます。

Bundle extras = intent.getExtras(); 
String tmp = extras.getString("myKey");

あなたはより多くの情報を見つけることができます:


3
なぜ直接System.objectとキャストを使用しないのですか?
lovespring 2014

78

BundleおよびIntentオブジェクトを使用して、アクティビティ間でデータを受け渡します。


最初にBundleオブジェクトを作成する

Bundle b = new Bundle();

次に、に格納されanystringている文字列データをバンドルキーに関連付けます"myname"

b.putString("myname", anystring);

次に、Intentオブジェクトを作成します

Intent in = new Intent(getApplicationContext(), secondActivity.class);

バンドルオブジェクトbをインテントに渡す

in.putExtras(b);

2番目のアクティビティを開始します

startActivity(in);

2番目のアクティビティでは、最初のアクティビティから渡されたデータにアクセスする必要があります

Intent in = getIntent();

次に、バンドルからデータを取得する必要があります

Bundle b = in.getExtras();

最後に、名前付きキーに関連付けられた文字列データの値を取得します "myname"

String s = b.getString("myname");

これは本当に良い回答です。ありがとうございます。
Abhishek Garg

67

バンドルはアクティビティによって使用され、将来自分自身にデータを渡すことを追加する必要があります。

画面が回転するか、別のアクティビティが開始されると、メソッドprotected void onSaveInstanceState(Bundle outState)が呼び出され、アクティビティが破棄されます。その後、アクティビティの別のインスタンスが作成され、public void onCreate(Bundle savedInstanceState)呼び出されます。アクティビティの最初のインスタンスが作成されたとき、バンドルはnullです。バンドルがnullでない場合、前任者によって開始された一部のビジネスはアクティビティーを続行します。

Androidはテキストをテキストフィールドに自動的に保存しますが、すべてを保存するわけではなく、微妙なバグが表示されることがあります。

ただし、最も一般的なアンチパターンは、それonCreate()が初期化だけを行うことを前提としています。また、状態を復元する必要があるため、誤りです。

この「ローテーション時にアクティビティを再作成する」動作を無効にするオプションがありますが、再起動に関連するバグを防ぐことはできず、言及するのがより難しくなるだけです。

また、アクティビティが破棄されるときに呼び出しが保証される唯一のメソッドはonPause()です。(ドキュメントのアクティビティライフサイクルグラフを参照してください。)


マッピングだけを使用できるのに、なぜバンドルを使用するのですか?テッド、ありがとう!
Ruchir Baronia

4
バンドルはアクティビティだけで使用されるわけではありません。また、回転後に状態を保持するためにフラグメントによって使用されます。
Kai Wang

47

A BundleMap、マップするJava オブジェクトによく似ています。Stringキーを値にています。アクティビティと他のアプリケーションコンポーネント間で情報を受け渡すために使用されます。フレームワークは、状態情報をキャプチャして復元するためにも使用されます。

Androidがこのためにプレーンな古いMapオブジェクトを使用しない理由は、Map柔軟性が高すぎるためです。シリアル化できないオブジェクト(I / Oストリームなど)を含めることができます。BundleAPIは、バンドルの内容は、シリアライズであることが保証されるようにバンドルに追加できるオブジェクトの種類を制限します。Androidフレームワークはこのプロパティに依存しています。

Application Fundamentalsのドキュメントを読むことをお勧めします。これにより、とりわけ、バンドルとインテントが何であり、それらが何に使用されるかが説明されます。


14

バンドルを使用すると、インテントを介して1つのアクティビティから別のアクティビティに任意のデータを送信できます。インテントをブロードキャストすると、興味のあるアクティビティ(および他のBroadcastRecievers)に通知されます。インテントにはバンドルを含めることができるため、インテントとともに追加のデータを送信できます。

バンドルはキーと値のマッピングであるため、ハッシュのように見えますが、厳密には単一のString / Fooオブジェクトマッピングに限定されません。特定のデータタイプのみが「Parcelable」と見なされ、Bundle APIで明示的に記述されていることに注意してください。


これは、これまでのところ、OPの質問、つまりバンドルとは何かに本当に取り組む唯一の答えです。stackoverflow.com/a/6236801/1588163は、より多くの洞察を提供します。
clapas 2014年

マッピングだけを使用できるのに、なぜバンドルを使用するのですか?ありがとう!
Ruchir Baronia

@RuchirBaroniaバンドルを必要とするAndroid APIの一部に渡すつもりでない限り、バンドルを使用する特別な理由はありません。
scriptocalypse

8

バンドルを作成するだけで、


Bundle simple_bundle=new Bundle();
simple_bundle.putString("item1","value1");
Intent i=new Intent(getApplicationContext(),this_is_the_next_class.class);
i.putExtras(simple_bundle);
startActivity(i);

「this_is_the_next_class.class」

このようなアイテムを取得できます。

Intent receive_i=getIntent();
Bundle my_bundle_received=receive_i.getExtras();
my_bundle_received.get("item1");
Log.d("Value","--"+my_bundle_received.get("item1").toString);

5

バンドルは、アクティビティ間でデータを渡すために使用されます。バンドルを作成し、それをIntentに渡してアクティビティを開始すると、宛先アクティビティから使用できます。


3

バンドル:-文字列値からさまざまなParcelableタイプへのマッピング。

バンドルは通常、Androidのさまざまなアクティビティ間でデータを渡すために使用されます。

onPause()を呼び出してから、onStop()を呼び出してから、onStop()をonPause()に逆順に呼び出します。

システムが以前の状態を復元するために使用する保存されたデータは「インスタンスの状態」と呼ばれ、Bundleオブジェクトに格納されたキーと値のペアのコレクションです。


マッピングは、バンドルの性質です。
BollMose、2016

2

bundleは、アクティビティ間でデータを共有し、oncreate()メソッドでアプリの状態を保存して、アプリがどこで停止したかがわかるようにするために使用されます...


0

バンドルを使用すると、インテントオブジェクトを利用して、あるアクティビティから別のアクティビティにデータが送信されます。バンドルは、任意のタイプのデータを保持します。

次に、2つのアクティビティ間でデータを渡すバンドルを作成する方法を説明します。

ステップ1:最初のアクティビティ

Bundle b=new Bundle();

b.putString("mkv",anystring);

Intent in=new Intent(getApplicationContext(),secondActivity.class);

in.putExtras(b);

startActivity(in);

ステップ2:2番目のアクティビティ

Intent in=getIntent();

Bundle b=in.getExtras();

String s=b.getString("mkv");

これはあなたに役立つと思います...........


0

バンドルは、2つの異なるコンポーネント間でデータを転送するだけでなく、アクティビティが新しいアクティビティに破棄される前に格納された値を復元するために使用されます。

EditTextウィジェットのテキストやのスクロール位置などListView


0

最初のアクティビティ:

String food = (String)((Spinner)findViewById(R.id.food)).getSelectedItem();
RadioButton rb = (RadioButton) findViewById(R.id.rb);
Intent i = new Intent(this,secondActivity.class);
i.putExtra("food",food);
i.putExtra("rb",rb.isChecked());

2番目のアクティビティ:

String food = getIntent().getExtras().getString("food");
Boolean rb = getIntent().getExtras().getBoolean("rb");

1
また、最小、完全、検証可能な例についても学びたいと思うかもしれません。
Daniel Corzo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.