Android伝値IntentとBundleの違い
2901 ワード
Android伝値IntentとBundleの違いを聞いた仲間は、以下をまとめた.
IntentとBundleの伝達値の違い
まず使用から:
Intent方式:
ページAからBにデータを渡し、Cに渡す必要があるとします.
Aページ:
Bページ:
まずBページでデータを受信する必要があります
そしてCページにデータを送ります
使用に不便な点は、Bページでデータを1本取り出してCページに転送することです.
Bundleを使用すると、Bページで転送されたBundleオブジェクトを直接取り出してCページに転送することができます.
Bundle方式:Aページ中:
Bページでデータを受信する:
次に、Bページにデータを送信する.
まとめ:
Bundleはオブジェクトを操作できますが、Intentはできません.BundleはIntentより多くのインタフェースを持ち、柔軟に使用できますが、Bundleを使用するにはIntentを使用してデータの転送を完了する必要があります.つまり、Bundleはデータの格納を目的とし、Intentは値の転送を目的としています.
次にintentのputメソッドのソースコードを見ます.
実は内部でもBundleを使ってデータを転送しているのが見えます.
余談
なぜBundleはHashmapの代わりに直接使わないのですか? Bundle内部はArrayMapによって実現され、ArrayMapの内部実現は2つの配列であり、1つのint配列は格納対象データ対応下付きであり、1つのオブジェクト配列はkeyとvalueを保存し、内部は二分法を用いてkeyをソートするので、データの追加、削除、検索の際には二分法を用いて検索し、小さなデータ量操作にのみ適している.データ量が比較的大きい場合、その性能は劣化します.一方,HashMap内部は配列+チェーンテーブル構造であるため,データ量が少ない場合,HashMapのEntry ArrayはArrayMapよりもメモリを多く消費する.Bundleを使用するシーンの多くは小さなデータ量なので、2つのActivityの間で10以上のデータを転送するシーンは見たことがありません.それに比べて、この場合はArrayMapを使用してデータを保存することで、操作速度とメモリ使用量に優位性があります.そのため、Bundleを使用してデータを転送することで、より速い速度とより少ないメモリ使用量を保証できます. もう1つの理由は、AndroidでIntentを使ってデータを携帯する場合、データが基本タイプか直列可能タイプ、HashMapでSerializableを使って直列化、BundleではParcelableを使って直列化する必要があるからです.Androidプラットフォームでは、Parcelableによるシーケンス化が推奨されており、書き方は複雑ですが、コストが少ないため、データのシーケンス化と逆シーケンス化をより迅速に行うためにBundleクラスがパッケージされており、データの転送が容易になります.
IntentとBundleの伝達値の違い
まず使用から:
Intent方式:
ページAからBにデータを渡し、Cに渡す必要があるとします.
Aページ:
Intent intent=new Intent(MainActivity.this,BActivity.class);
intent.putExtra("String","MainActivity ");
intent.putExtra("int",11);
startActivity(intent);
Bページ:
まずBページでデータを受信する必要があります
Intent intent = getIntent();
string = intent.getStringExtra("String");
key = intent.getIntExtra("int",0);
そしてCページにデータを送ります
Intent intent=new Intent(BActivity.this,CActivity.class);
intent.putExtra("String1",string);
intent.putExtra("int1",key);
intent.putExtra("boolean",true);
startActivity(intent);
使用に不便な点は、Bページでデータを1本取り出してCページに転送することです.
Bundleを使用すると、Bページで転送されたBundleオブジェクトを直接取り出してCページに転送することができます.
Bundle方式:Aページ中:
Intent intent = new Intent(MainActivity.this, BActivity.class);
Bundle bundle = new Bundle();
bundle.putString("String","MainActivity ");
bundle.putInt("int",11);
intent.putExtra("bundle",bundle);
startActivity(intent);
Bページでデータを受信する:
Intent intent = getIntent();
bundle=intent.getBundleExtra("bundle");
次に、Bページにデータを送信する.
Intent intent=new Intent(BActivity.this,CActivity.class);
// CActivity
bundle.putBoolean("boolean",true);
intent.putExtra("bundle1",bundle);
startActivity(intent);
まとめ:
Bundleはオブジェクトを操作できますが、Intentはできません.BundleはIntentより多くのインタフェースを持ち、柔軟に使用できますが、Bundleを使用するにはIntentを使用してデータの転送を完了する必要があります.つまり、Bundleはデータの格納を目的とし、Intentは値の転送を目的としています.
次にintentのputメソッドのソースコードを見ます.
public @NonNull Intent putExtra(String name, Parcelable value) {
if (mExtras == null) {
mExtras = new Bundle();
}
mExtras.putParcelable(name, value);
return this;
}
実は内部でもBundleを使ってデータを転送しているのが見えます.
余談
なぜBundleはHashmapの代わりに直接使わないのですか?