将自定义对象从一个Activity传递到另一个Parcelable vs Bundle

时间:2012-09-11 05:52:23

标签: android android-intent android-activity

我想将一个自定义Object从一个活动传递到另一个活动,Object包含一个String和一个另一个自定义Object的List,它包含一个字符串数组和一个int数组。我看过https://stackoverflow.com/a/2141166/830104,但后来我找到了这个答案https://stackoverflow.com/a/7842273/830104。使用Bundle或Parcelable哪个更好?有什么不同?我什么时候应该使用它?
感谢您的回复,

1 个答案:

答案 0 :(得分:9)

ParcelableBundle不是排他性概念;您甚至可以一次在您的应用上进行部署。

[1]术语Parcelable附带Java中的序列化概念(以及其他高级语言,如C#,Python,......)。它确保此类Parcelable类的对象(保留在RAM存储中)可以保存在文件流(如文本或内存)中(离线状态)然后可以重建以用于程序在运行时(在线状态)。

在Android应用程序中,在independent activities内(仅限运行 - 一个启动,然后其他人必须停止):

当前活动将没有指针引用前一个及其成员 - 因为之前的活动已停止并从内存中清除;为了保持对象的值传递给下一个活动(从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