Passing A Custom Object From One Activity To Another Parcelable Vs Bundle
Solution 1:
Parcelable
and Bundle
are not exclusive concepts; you can even deploy both on your app at a time.
[1] Term Parcelable
comes with Serialization concept in Java (and other high-level language such as C#, Python,...). It ensures that an object - which remains in RAM store - of such Parcelable
class can be saved in file stream such as text or memory (offline status) then can be reconstructed to be used in program at runtime (online status).
In an Android application, within 2 independent activities
(exclusively running - one starts then other will have to stop):
There will be NO pointer from current activity to refer to previous one and its members - because previous activity is stopped and cleared out form memory; so that to maintain object's value passed to next activity (called from Intent
) the object need to be parcelable
(serializable
).
[2] While Bundle
is normally the Android concept, denotes that a variable or group of variables. If look into lower level, it can be considered as HashMap with key-value pairs.
Conclusion:
Bundle
is to store many objects with related keys, it can save any object in native types, but it doesn't know how to save a complex object (which contains an ArrayList for example)Parcelable
class is to ensure a complex instance of it can beserialized
andde-serialized
during runtime. This object can contains complex types such as ArrayList, HashMap, array, or struct,...
[UPDATED] - Example:
//Class without implementing Parcelable will cause error //if passing though activities via IntentpublicclassNoneParcelable
{
private ArrayList<String> nameList = new ArrayList<String>();
publicNoneParcelable()
{
nameList.add("abc");
nameList.add("xyz");
}
}
//Parcelable Class's objects can be exchanged publicclassGoodParcelableimplementsParcelable
{
private ArrayList<String> nameList = new ArrayList<String>();
publicGoodParcelable()
{
nameList.add("Can");
nameList.add("be parsed");
}
@Override
publicintdescribeContents()
{
return0;
}
@Override
publicvoidwriteToParcel(Parcel dest, int flags)
{
// Serialize ArrayList name here
}
}
In source activity:
NoneParcelablenonePcl=newNoneParcelable();
GoodParcelablegoodPcl=newGoodParcelable();
intcount=100;
Intenti=newIntent(...);
i.putExtra("NONE_P",nonePcl);
i.putExtra("GOOD_P",goodPcl);
i.putExtra("COUNT", count);
In destination activity:
Intenti= getIntent();
//this is BAD:NoneParcelablenP= (NoneParcelable)i.getExtra("NONE_P"); //BAD code//these are OK:intcount= (int)i.getExtra("COUNT");//OK
GoodParcelable myParcelableObject=(GoodParcelable)i.getParcelableExtra("GOOD_P");// OK
Post a Comment for "Passing A Custom Object From One Activity To Another Parcelable Vs Bundle"