Androidアプリでは、画面(Activity)間でデータを渡す必要がある場面がよくあります。
Javaのアプリケーションでも、あるウィンドウから別のウィンドウに情報を渡すことがありますよね。それと同じですが、Androidではそれを**Intent
とBundle
という仕組みで行う**のが基本です。
■ Bundleとは?
Bundle
は、キーと値のペアを保存できる「マップ」のようなものです。
Androidでは、値を受け渡ししたり、状態を一時保存するための標準的なコンテナとして使われます。
Bundle bundle = new Bundle();
bundle.putString("username", "tanaka");
bundle.putInt("age", 25);
文字列、数値、真偽値、配列、Serializable など、さまざまなデータ型を保存できます。
■ Activity間のデータ受け渡し(画面遷移)
たとえば、「ログイン画面からメイン画面にユーザー名を渡す」ような場合:
● 送り側(MainActivity から SecondActivity)
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("username", "tanaka"); // Intent に直接データを追加(内部的には Bundle)
startActivity(intent);
実は putExtra()
の内部では、Intent が持つ Bundle
に値を入れています。
● 受け取り側(SecondActivity)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent intent = getIntent();
String username = intent.getStringExtra("username");
TextView textView = findViewById(R.id.textView);
textView.setText("ようこそ、" + username + "さん!");
}
getIntent().getStringExtra()
で受け取れます。
■ Bundle
を明示的に使いたい場合
Intent の putExtras()
や getExtras()
を使って、まとめてデータを渡すこともできます。
Bundle bundle = new Bundle();
bundle.putString("username", "tanaka");
bundle.putInt("age", 25);
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtras(bundle); // Intent にまとめて Bundle を渡す
startActivity(intent);
受け取り側では:
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
String username = bundle.getString("username");
int age = bundle.getInt("age");
}
■ Javaエンジニアとしての違和感?
Bundle
の中身は 型安全ではない(キーのスペルミスなどはコンパイルで検知されない)Serializable
やParcelable
を使う必要がある(Javaのシリアライズと似て非なるParcelable
)Bundle
やIntent
に入れられるものは、あくまで プリミティブ or 軽量データが前提
とはいえ、Activity間のデータ渡し=Intent+Bundleが標準的な方法なので、まずはこの形に慣れるのが一番です。
■ その他の用途(ちょっと先の話)
onSaveInstanceState()
やonRestoreInstanceState()
の中でもBundle
は使われます(画面回転時の状態保持)Fragment
とのデータやりとりにもBundle
が使われます(setArguments()
/getArguments()
)
■ まとめ
項目 | 内容 |
---|---|
Bundle とは? | キーと値のマップ。Intentや状態保存に使われる |
よく使うケース | Activity間の画面遷移時に値を渡す |
値の渡し方 | intent.putExtra() または intent.putExtras(bundle) |
値の受け取り方 | intent.getStringExtra() や intent.getExtras() から取得 |
注意点 | 型安全でないためキーの間違いに注意 |
最初は冗長に感じるかもしれませんが、Androidでは頻出パターンなので早めに慣れておくと安心です。