我想将自定义对象从一个活动传递到另一个活动,该对象由一个字符串和另一个自定义对象的列表组成,该对象由一个字符串数组和一个整数数组组成。我读过 https://stackoverflow.com/a/2141166/830104,但后来我找到了这个答案https://stackoverflow.com/a/7842273/830104。使用 Bundle 或 Parcelable 哪个更好?有什么不同?我应该什么时候使用这个?
谢谢你的回复,
丹
1 回答
Parcelable
并且Bundle
不是排他性的概念;您甚至可以同时在您的应用程序上部署两者。
[1] 术语Parcelable
在 Java(和其他高级语言,如 C#、Python 等)中带有序列化概念。它确保此类的对象(保留在 RAM 存储中)Parcelable
可以保存在文件流中,例如文本或内存(离线状态),然后可以在运行时重构以在程序中使用(在线状态)。
在 Android 应用程序中,在 2 内independent activities
(仅运行 - 一个启动,然后另一个必须停止):
当前活动将没有指向前一个活动及其成员的指针 - 因为先前的活动已停止并清除了表单内存;为了保持传递给下一个活动(从调用Intent
)的对象的值,对象需要是parcelable
(serializable
)。
[2] WhileBundle
通常是Android的概念,表示一个变量或一组变量。如果往下看,可以认为是键值对的HashMap。
结论:
Bundle
就是用相关键存储很多对象,它可以保存任何原生类型的对象,但是它不知道如何保存一个复杂的对象(例如包含一个ArrayList)Parcelable
class 是为了确保它的复杂实例可以在运行时serialized
。de-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