6

我想将自定义对象从一个活动传递到另一个活动,该对象由一个字符串和另一个自定义对象的列表组成,该对象由一个字符串数组和一个整数数组组成。我读过 https://stackoverflow.com/a/2141166/830104,但后来我找到了这个答案https://stackoverflow.com/a/7842273/830104。使用 Bundle 或 Parcelable 哪个更好?有什么不同?我应该什么时候使用这个?
谢谢你的回复,

4

1 回答 1

11

Parcelable并且Bundle不是排他性的概念;您甚至可以同时在您的应用程序上部署两者。

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

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

当前活动将没有指向前一个活动及其成员的指针 - 因为先前的活动已停止并清除了表单内存;为了保持传递给下一个活动(从调用Intent)的对象的值,对象需要是parcelableserializable)。

[2] WhileBundle通常是Android的概念,表示一个变量或一组变量。如果往下看,可以认为是键值对的HashMap。

结论:

  • Bundle就是用相关键存储很多对象,它可以保存任何原生类型的对象,但是它不知道如何保存一个复杂的对象(例如包含一个ArrayList)

  • Parcelableclass 是为了确保它的复杂实例可以在运行时serializedde-serialized该对象可以包含复杂类型,例如 ArrayList、HashMap、array 或 struct,...

[更新] - 示例:

//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 回答