Android伝値IntentとBundleの違い

2901 ワード

Android伝値Intentと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の代わりに直接使わないのですか?
  • 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クラスがパッケージされており、データの転送が容易になります.