zoukankan      html  css  js  c++  java
  • 安卓学习之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示例代码:
     publicclassMyParcelableimplementsParcelable{
         privateint mData;
    
         publicint describeContents(){
             return0;
         }
    
         publicvoid writeToParcel(Parcelout,int flags){
             out.writeInt(mData);
         }
    
         publicstaticfinalParcelable.Creator<MyParcelable> CREATOR
                 =newParcelable.Creator<MyParcelable>(){
             publicMyParcelable createFromParcel(Parcelin){
                 returnnewMyParcelable(in);
             }
    
             publicMyParcelable[] newArray(int size){
                 returnnewMyParcelable[size];
             }
         };
         
         privateMyParcelable(Parcelin){
             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 接口。
     
  • 相关阅读:
    bat 笔记 一
    air 桌面应用发布后可以删除的文件
    as3 去掉字符串空白问题
    as3 air 获取文件夹下的所有文件
    egret 配置设置
    egret 精简游戏项目
    starling 第一天
    《笨办法学Python》 第2课手记
    《笨办法学Python》 第1课手记
    《笨办法学Python》 第0课手记
  • 原文地址:https://www.cnblogs.com/meetweb/p/2835200.html
Copyright © 2011-2022 走看看