android 数据传递详解(Serialization、Parcelable、Parcel、Intent、Bundle)

第一、四大组件间数据传递方式:
启动四大组件通过Intent对象来实现,Intent的功能包括启动四大组件以及相关信息+传递数据。
其中传递数据Intent提供了putExtra和对应的getExtra方法来实现:
putExtra和getExtra 其实是和Bundle  put和get方法一一对应的,在Intent类中有一个Bundle的mExtras成员变量
所有的putExtra和getExtra方式实际是调用mExtras对象的put和get方法进行存取。
所以正常情况下 四大组件间传递数据直接通过putExtra和getExtra方法存取即可,无需再创建一个bundle对象。
Intent  putExtra方法:
Intent  putExtra(String name, Bundle value) Intent  putExtra(String  name, Parcelable[] value) Intent  putExtra(String name, Serializable  value)
Intent  putExtra(String name, Parcelable value) Intent  putExtra(String  name, int[] value) Intent  putExtra(String name, float value) Intent   putExtra(String name, byte[] value) Intent  putExtra(String name, long[]  value) Intent  putExtra(String name, float[] value) Intent   putExtra(String name, long value) Intent  putExtra(String name, String[]  value) Intent  putExtra(String name, boolean value) Intent   putExtra(String name, boolean[] value) Intent  putExtra(String name, short  value) Intent  putExtra(String name, double value) Intent  putExtra(String  name, short[] value) Intent  putExtra(String name, String value) Intent   putExtra(String name, byte value) Intent  putExtra(String name, char[]  value) Intent  putExtra(String name, CharSequence[] value) Intent   putExtras(Intent src) Intent  putExtras(Bundle extras) Intent   putIntegerArrayListExtra(String name, ArrayList<Integer> value) Intent   putParcelableArrayListExtra(String name, ArrayList<? extends Parcelable>  value) Intent  putStringArrayListExtra(String name, ArrayList<String>  value)
 
Intent getExtra方法:
double[]  getDoubleArrayExtra(String name) double  getDoubleExtra(String  name, double defaultValue) Bundle  getExtras() int  getFlags() float[]   getFloatArrayExtra(String name) float  getFloatExtra(String name, float  defaultValue) int[]  getIntArrayExtra(String name) int  getIntExtra(String  name, int defaultValue) ArrayList<Integer>   getIntegerArrayListExtra(String name) long[]  getLongArrayExtra(String  name) long  getLongExtra(String name, long defaultValue) Parcelable[]   getParcelableArrayExtra(String name) <T extends Parcelable>  ArrayList<T>  getParcelableArrayListExtra(String name) <T extends  Parcelable> T  getParcelableExtra(String name) Serializable   getSerializableExtra(String name) short[]  getShortArrayExtra(String  name) short  getShortExtra(String name, short defaultValue) String[]   getStringArrayExtra(String name) ArrayList<String>   getStringArrayListExtra(String name) String  getStringExtra(String  name)
 
Intent 的mExtras对象:
    private Bundle mExtras;
 
    public Intent putExtra(String name, Parcelable value) {         if  (mExtras == null) {             mExtras = new Bundle();          }         mExtras.putParcelable(name, value);         return this;      }
 
 
第二、自定义对象的传递:
通过intent 传递自定义对象的方法有两个,第一是实现Serialization接口,第二是实现Parcelable接口。
首选推荐Parceable,android中的很多数据类型都是实现Serialable接口方式来传递的,例如 Intent、Bundle、Bitmap、Uri等等。
android Parcelable化的提供了一个接口 Parcelable和一个工具类 Parcel
Parcelable:一个规范接口,定义实现Parcelable需要实现的功能
Parcel:数据存取的工具类,供用户在实现Parcelable接口时存取自定义数据用,也供系统传递数据时使用。
 
Parcelable实现要点:需要实现三个东西 1)writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.声明如下: writeToParcel (Parcel dest, int flags) 具体参数含义见javadoc 2)describeContents方法。没搞懂有什么用,反正直接返回0也可以 3)静态的Parcelable.Creator接口,本接口有两个方法: createFromParcel(Parcel  in) 实现从in中创建出类的实例的功能 newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new  T[size])即可。估计本方法是供外部类反序列化本类数组使用。
android doc示例代码:
public class MyParcelable implements Parcelable {
     private int mData;

     public int describeContents() {
         return 0;
     }

     public void writeToParcel(Parcel out, int flags) {
         out.writeInt(mData);
     }

     public static final Parcelable.Creator<MyParcelable> CREATOR
             = new Parcelable.Creator<MyParcelable>() {
         public MyParcelable createFromParcel(Parcel in) {
             return new MyParcelable(in);
         }

         public MyParcelable[] newArray(int size) {
             return new MyParcelable[size];
         }
     };
     
     private MyParcelable(Parcel in) {
         mData = in.readInt();
     }
 }

android 中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable。

一  序列化原因:

1.永久性保存对象,保存对象的字节序列到本地文件中; 2.通过序列化对象在网络中传递对象; 3.通过序列化在进程间传递对象。

二  至于选取哪种可参考下面的原则:

1.在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,  也不提倡用,但在这种情况下,还是建议你用Serializable 。

实现: 1  Serializable 的实现,只需要继承  implements Serializable 即可。这只是给对象打了一个标记,系统会自动将其序列化。
2  Parcelabel 的实现,需要在类中添加一个静态成员变量 CREATOR,这个变量需要继承 Parcelable.Creator 接口。
posted @ 2012-06-23 16:23  坏混混  阅读(903)  评论(0编辑  收藏  举报