我想将一个自定义Object从一个活动传递到另一个活动,Object包含一个String和一个另一个自定义Object的List,它包含一个字符串数组和一个int数组。我看过https://stackoverflow.com/a/2141166/830104,但后来我找到了这个答案https://stackoverflow.com/a/7842273/830104。使用Bundle或Parcelable哪个更好?有什么不同?我什么时候应该使用它?
感谢您的回复,
丹
答案 0 :(得分:9)
Parcelable
和Bundle
不是排他性概念;您甚至可以一次在您的应用上进行部署。
[1]术语Parcelable
附带Java中的序列化概念(以及其他高级语言,如C#,Python,......)。它确保此类Parcelable
类的对象(保留在RAM存储中)可以保存在文件流(如文本或内存)中(离线状态)然后可以重建以用于程序在运行时(在线状态)。
在Android应用程序中,在independent activities
内(仅限运行 - 一个启动,然后其他人必须停止):
当前活动将没有指针引用前一个及其成员 - 因为之前的活动已停止并从内存中清除;为了保持对象的值传递给下一个活动(从Intent
调用),对象需要parcelable
(serializable
)。
[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