您的位置:首页 > 移动开发 > Android开发

【Android 基础】 Parcelable 使用

2016-07-21 14:50 253 查看
Android 序列化对象方法

实现Parcelable接口方法步骤

Demo 代码实现
建立实现Parcelable接口Person类

MainActivity中序列化

SecondActivity 中反序列化

打印结果

Android 序列化对象方法:

实现Serializable接口,Java自带;

实现Parcelable接口,android特有接口,效率高于Serializable接口,支持Intent数据传递,也可用于跨进程通讯(IPC);

实现Parcelable接口方法步骤:

Java 实体实现 Parcelable 接口,且需要实现以下几个方法:

describeContents方法。内容接口描述,默认返回0就可以;

writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.即打包需要传递的数据到Parcel容器保存,以便从parcel容器获取数据,该方法声明如下:writeToParcel (Parcel dest, int flags)

静态的Parcelable.Creator接口,本接口有两个方法:

createFromParcel(Parcel in)
//从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。

newArray(int size)
//创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。


Demo 代码实现

1. 建立实现Parcelable接口Person类

/**
* Created by JerryLiu on 2016/7/21.
*/
public class Person implements Parcelable {

private static final String TAG = "LiuDongBing";

private String userName;
private String passWord;

public Person() {
Log.d(TAG, "Person(): ");
}

public Person(String userName, String passWord) {
Log.d(TAG, "Person() called with: " + "userName = [" + userName + "], passWord = [" + passWord + "]");
this.userName = userName;
this.passWord = passWord;
}

public String getUserName() {
Log.d(TAG, "getUserName: = " + userName);
return userName;
}

public void setUserName(String userName) {
Log.d(TAG, "setUserName: = " + userName);
Log.d(TAG, "setUserName() called with: " + "userName = [" + userName + "]");
this.userName = userName;
}

public String getPassWord() {
Log.d(TAG, "getPassWord: =  " + passWord);
return passWord;
}

public void setPassWord(String passWord) {
Log.d(TAG, "setPassWord: = passWord");
this.passWord = passWord;
}

/**
* Describe the kinds of special objects contained in this Parcelable's
* marshalled representation.
*
* @return a bitmask indicating the set of special object types marshalled
* by the Parcelable.
*/
@Override
public int describeContents() {
Log.d(TAG, "describeContents: ");
return 0;
}

/**
* Flatten this object in to a Parcel.
*
* @param dest  The Parcel in which the object should be written.
* @param flags Additional flags about how the object should be written.
*              May be 0 or {@link #PARCELABLE_WRITE_RETURN_VALUE}.
*/
@Override
public void writeToParcel(Parcel dest, int flags) {

Log.d(TAG, "writeToParcel: = " + flags);
dest.writeString(userName);
dest.writeString(passWord);

}

public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel source) {
Log.d(TAG, "createFromParcel: ");
Person person = new Person();
person.userName = source.readString();
person.passWord = source.readString();
Log.d(TAG, "createFromParcel: " + "person.userName = " + person.userName
+ "\nperson.passWord" + person.passWord);
LogUtils.d(person);
return person;
}

@Override
public Person[] newArray(int size) {
Log.d(TAG, "newArray: size = " + size);
return new Person[size];
}
};
}


2. MainActivity中序列化

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

bundle_btn = (Button) findViewById(R.id.button);

bundle_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
Person person = new Person("LiuDongBing", "abc.1234");
Bundle bundle = new Bundle();
//Parcelable 序列化
bundle.putParcelable("person", person);
intent.putExtras(bundle);
Log.d(TAG, "onClick: startActivity(intent)");
startActivity(intent);
}
});
}


3. SecondActivity 中反序列化

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);

Intent intent = getIntent();
Bundle extras = intent.getExtras();
//Parcelable 反序列化
Person person = extras.getParcelable("person");
Log.d(TAG, "onCreate: " + "person.getUserName()" + person.getUserName()
+ "\nperson.getPassWord()" + person.getPassWord());
}


4. 打印结果

D/LiuDongBing: Person() called with: userName = [LiuDongBing], passWord = [abc.1234]
D/LiuDongBing: onClick: startActivity(intent)
D/LiuDongBing: writeToParcel: = 0
D/LiuDongBing: createFromParcel:
D/LiuDongBing: Person():
D/LiuDongBing: createFromParcel: person.userName = LiuDongBing
person.passWord = abc.1234
D/LogUtils-/Person$1.createFromParcel(Person.java:90): Person {CREATOR =  {}, TAG = "LiuDongBing", passWord = "abc.1234", userName = "LiuDongBing"}
D/LiuDongBing: getUserName: = LiuDongBing
D/LiuDongBing: getPassWord: =  abc.1234
D/LiuDongBing: onCreate: person.getUserName()LiuDongBing
person.getPassWord()abc.1234


源码连接:https://github.com/JerrryLiu/ParceleableTest
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息