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

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


第一、四大组件间数据传递方式:
启动四大组件通过Intent对象来实现,Intent的功能包括启动四大组件以及相关信息+传递数据。
其中传递数据Intent提供了putExtra和对应的getExtra方法来实现:
putExtra和getExtra 其实是和Bundle put和get方法一一对应的,在Intent类中有一个Bundle的mExtras成员变量
所有的putExtra和getExtra方式实际是调用mExtras对象的put和get方法进行存取。
所以正常情况下 四大组件间传递数据直接通过putExtra和getExtra方法存取即可,无需再创建一个bundle对象。

Intent  putExtra方法:
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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示例代码:
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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 接口。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值