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

6
我想在一个Activity中向另一个Activity传递一个自定义对象,该对象由一个字符串和另一个自定义对象的列表组成,该自定义对象包含一个字符串数组和一个整数数组。我已经阅读了https://dev59.com/m3I95IYBdhLWcg3w1BdN#2141166,但是我发现了这个答案https://stackoverflow.com/a/7842273/830104。使用Bundle还是Parcelable更好?有什么区别?我应该在什么情况下使用它们?
感谢您的回复,

如果您的对象仅包含字符串、字符串数组和整数数组,则只需使类可序列化,并在启动下一个“Activity”时使用“Intent”的putExtra(String name, Serializable value)方法。 - Squonk
1个回答

11
ParcelableBundle并不是互斥的概念;您甚至可以同时在您的应用程序上使用两者。术语Parcelable与Java中的序列化概念(以及其他高级语言,如C#,Python等)一起提供。它确保这样的Parcelable类的对象 - 仍留在RAM存储器中 - 可以保存在文件流(例如文本或内存)中,然后可以重构为在运行时(在线状态)中在程序中使用。
在一个Android应用程序中,在2个独立的activity之间(互斥运行,一个启动,另一个将停止):
当前 activity 没有指针来引用前一个活动及其成员 - 因为前一个活动已停止,并从内存中清除; 因此,为了保持传递给下一个活动的对象的值(从Intent调用),必须将对象设置为可Parcelable(可Serializable)。
虽然Bundle通常是指Android中的一个概念,用于表示一个变量或一组变量。如果我们深入看一下它的底层,它可以被认为是带有键值对的HashMap。
结论: - Bundle用于存储许多具有相关键的对象,它可以保存任何原生类型的对象,但是它不知道如何保存一个复杂对象(例如包含ArrayList的对象)。 - Parcelable类用于确保其复杂实例在运行时可以进行序列化和反序列化。这个对象可以包含复杂类型,如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

3
实际上,Bundle是Parcelable接口的一个具体实现。您可以通过将对象数据创建为Bundle对象并使用intent.putExtra("myObj", myObj.toBundle()) / MyObject.fromBundle(intent.getBundleExtra("myObj"))来存储/检索它,从而避免使用可怕的Parcelable接口。您需要自己实现toBundle() / fromBundle()方法,类似于将对象属性存储到哈希映射中。 - Risadinha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接