6

あるアクティビティから別のアクティビティにカスタム オブジェクトを渡したいのですが、オブジェクトは文字列と、文字列の配列と int の配列で構成される別のカスタム オブジェクトのリストで構成されています。https://stackoverflow.com/a/2141166/830104を読み ましたが、この回答https://stackoverflow.com/a/7842273/830104を見つけました。バンドルとパーセルブルのどちらを使用するのが良いですか? 違いはなんですか?これをそれぞれいつ使用する必要がありますか?
返信ありがとうございます、
ダン

4

1 に答える 1

11

Parcelable排他的な概念ではありBundleません。一度に両方をアプリにデプロイすることもできます。

[1] 用語Parcelableには、Java (および C#、Python などの他の高水準言語) のシリアライゼーションの概念が付属しています。Parcelableそのようなクラスのオブジェクト (RAM ストアに残る) を、テキストやメモリなどのファイル ストリームに保存し (オフライン ステータス)、実行時にプログラムで使用するために再構築できるようにします (オンライン ステータス)。

Android アプリケーションでは、2 以内independent activities(排他的に実行 - 1 つが開始され、もう 1 つが停止する必要があります):

以前のアクティビティとそのメンバーを参照する現在のアクティビティからのポインタはありません。これは、以前のアクティビティが停止され、メモリから消去されるためです。そのため、次のアクティビティ(から呼び出される) に渡されるオブジェクトの値を維持するには、オブジェクトを( )Intentにする必要があります。parcelableserializable

[2]Bundleは通常 Android の概念ですが、変数または変数のグループを示します。下位レベルに目を向けると、キーと値のペアを持つ HashMap と見なすことができます。

結論:

  • Bundle関連するキーを持つ多くのオブジェクトを保存することです。ネイティブ型の任意のオブジェクトを保存できますが、複雑なオブジェクト(たとえば、ArrayList を含む)を保存する方法がわかりません。

  • Parcelableクラスは、実行時にその複雑なインスタンスを確実に作成できるようにするためのものserializedです。de-serializedこのオブジェクトには、ArrayList、HashMap、配列、または構造体などの複雑な型を含めることができます...

[更新] - 例:

//Class without implementing Parcelable will cause error 
//if passing though activities via Intent
public class NoneParcelable
{
    private ArrayList<String> nameList = new ArrayList<String>();
    public NoneParcelable()
    {
        nameList.add("abc");
        nameList.add("xyz");            
    }
}

//Parcelable Class's objects can be exchanged 
public class GoodParcelable implements Parcelable
{
    private ArrayList<String> nameList = new ArrayList<String>();
    public GoodParcelable()
    {
        nameList.add("Can");
        nameList.add("be parsed");          
    }
    @Override
    public int describeContents()
    {
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags)
    {
        // Serialize ArrayList name here            
    }
}

ソース アクティビティ内:

NoneParcelable nonePcl = new NoneParcelable();
GoodParcelable goodPcl = new GoodParcelable();
int count = 100;

Intent i = new Intent(...);
i.putExtra("NONE_P",nonePcl);
i.putExtra("GOOD_P",goodPcl);
i.putExtra("COUNT", count);

宛先アクティビティ:

Intent i = getIntent();

//this is BAD:
NoneParcelable nP = (NoneParcelable)i.getExtra("NONE_P"); //BAD code

//these are OK:
int count = (int)i.getExtra("COUNT");//OK
GoodParcelable myParcelableObject=(GoodParcelable)i.getParcelableExtra("GOOD_P");// OK
于 2012-09-11T06:20:24.930 に答える