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

RCB*_*RCB 5 android android-intent android-activity

我想将一个自定义Object从一个活动传递给另一个活动,Object包含一个String和一个另一个自定义Object的List,它包含一个字符串数组和一个int数组.我已经阅读了 /sf/answers/149881651/,但后来我找到了这个答案/sf/answers/548959141/.使用Bundle或Parcelable哪个更好?有什么不同?我什么时候应该使用它?
谢谢你的回复,

Kel*_*inh 9

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

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

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

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

[2]虽然Bundle通常是Android概念,但表示变量或变量组.如果查看较低级别,可以将其视为具有键值对的HashMap.

结论:

  • Bundle是存储许多具有相关键的对象,它可以保存本机类型中的任何对象,但它不知道如何保存复杂对象(例如包含ArrayList)

  • Parcelableclass是为了确保它的复杂实例可以serializedde-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            
    }
}
Run Code Online (Sandbox Code Playgroud)

在源活动中:

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);
Run Code Online (Sandbox Code Playgroud)

在目的地活动中:

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
Run Code Online (Sandbox Code Playgroud)

  • 实际上,Bundle是Parcelable的具体实现.您可以通过简单地从对象的数据创建Bundle对象并使用intent.putExtra("myObj",myObj.toBundle())/ MyObjecet.fromBundle(intent.getBundleExtra("myObj"))来避免可怕的Parcelable接口/检索它.您必须自己实现toBundle()/ fromBundle(),类似于将对象属性存储到hashmap中. (3认同)