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 接口。