Android 技术之Serializable和Parcelable方式
2016-12-13 21:52
459 查看
Serializable和Parcelable方式
对于初学者来说,一般看到这两个方式都不知道是干嘛用的,我也是看了一些资料才看到学到的。(有空还是多学学吧,毕竟为了老婆本啊!)首先大概说一下,相信很多人都知道Intent 在activity中传递对象的方式:
Intent intent = new Intent(); intent.setClass(MainActivity.this,twoActivty.class); intent.putExtra("name","wang"); intent.putExtra("age",1); startActivity(intent);
很简单吧!我们可以在intent 里面添加一些数据,达到传值的效果,然后我们只需要在需要用的activity中:
getInten().getStringExtra("name"); getInten().getIntExtra("age");
但是你可很简单的看到,这个传值是有限制的,就是它支持的数据类型是有限的,如果你想要去传一些自定义对象的时候,呵呵呵!
这个时候你就可以用到Serializable和Parcelable方式了!!!!
(1)Serializable
字面上的意思就是序列化的意思,它可以将一个对象转化成 可以存储的或者可以传输的状态,然后你可以在网络上传输,也可以在本地上存储 ,它就是一个接口,你只需要在bean中implements Serializable(就这么简单)
public class Per implements Serializable{ private String user; private int p; public Per(String user, int p) { this.user = user; this.p = p; } public String getUser() { return user; } public void setUser(String user) { this.user = user; } public int getP() { return p; } public void setP(int p) { this.p = p; } }
这样所有的Per对象都是可序列化了,其中get和set方法都是用骨赋值和读取字段数据的,然后我们在第一个activity中:
button = (Button) findViewById(R.id.sss); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getApplicationContext(),twoActivty.class); Per p= new Per("SS",54); intent.putExtra("ss",p); startActivity(intent); } });
接着,在你需要用到的activity中 :
Per p = (Per) getIntent().getSerializableExtra("ss"); ss.setText(+"getUser:"+p.getUser()+"\n"+"getP:"+p.getP());
拿到Per后,然后向下转型成Per对象,p.getUser就是你想拿到的东西了!
(2)Parcelable
Parcelable实现的原理是将一个完整的对象进行分解,然后分解出来的每一部分就是Intent所支持的数据类型,这样就可以实现传递对象的功能了!直接上代码:
public class Stu implements Parcelable { private String name; private int age; public Stu() { } public Stu(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); //写出name dest.writeInt(age); //写出age } public static final Parcelable.Creator<Stu> CREATOR = new Parcelable.Creator<Stu>(){ @Override public Stu[] newArray(int size) { return new Stu[size]; } @Override public Stu createFromParcel(Parcel source) { Stu s = new Stu(); s.name = source.readString(); //读取name s.age = source.readInt(); // 读取age return s; } }; }
这时,你会发现好像好复杂,其实刚才我又写到,这是把他们分解,别总是觉得和Serializable对比起来多了好多行,然后就不去看一下代码怎么写到,如果你认真看一下就。。。。(哦哦哦)
其中需要注意一个地方就是字符串类型就要写成 writeString(),整形数据就是writeIntent()方法,以此类推
还有必须实现两个方法,describeContents和writeToParcel (看字面意思就知道什么意思了,除非你不懂英文,这我就没办法帮你了)
describeContents()直接返回0 就好了
最后,还必须在这个Stu中提供一个名为CREATOR 的常量 ,是固定的 ,
Parcelable.Creator接口的一个实现 ,然后泛型就是我们自定义的Stu ,newArray和createFromParcel这两个方法要记得重写。
最后,需要注意的地方就是
“getIntent().getParcelableExtra(“ss”);
其他都是一样的啦!!!!!!
总结一下吧,两个方式对比的话,前面的会比较简单,但是由于把整个对象都序列化了,效率一定比不过后者,所以你就可以根据你的需求选择一下实现吧!
谢谢!这是本人写的第三篇,写的不好,少喷啊!发现才会用这个编辑器,,哎哎哎啊!以后再加上图片和其他的!
相关文章推荐
- 使用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的关闭事件