【Android 基础】 Parcelable 使用
2016-07-21 14:50
253 查看
Android 序列化对象方法
实现Parcelable接口方法步骤
Demo 代码实现
建立实现Parcelable接口Person类
MainActivity中序列化
SecondActivity 中反序列化
打印结果
实现Parcelable接口,android特有接口,效率高于Serializable接口,支持Intent数据传递,也可用于跨进程通讯(IPC);
describeContents方法。内容接口描述,默认返回0就可以;
writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.即打包需要传递的数据到Parcel容器保存,以便从parcel容器获取数据,该方法声明如下:writeToParcel (Parcel dest, int flags)
静态的Parcelable.Creator接口,本接口有两个方法:
源码连接:https://github.com/JerrryLiu/ParceleableTest
实现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
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories