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

学习Android中的Parcelable接口

2015-08-14 00:00 423 查看
摘要: android 并没有提供在两个 activity之间传递任意对象或者引用的方法,但是就是需要传递对象该怎么办呢,这个时候就需要 让该对象实现android 提供的 parcelable接口,如果该对象实现了parcelable接口,那么就可以利用相应的方法进行传递了,putExtra(String name,Parcelable user);可以看出,我们可以传递一个被Parcelable包装过的对象了

接触安桌不久,在之后很长的一段时间我将会一直在研究安桌开发。只是为了实现一下自己的想法。

1.首先要说parcelable之前必须要说一下,Serializable接口。看了很多教程,在说Activity数值传递的过程便是要先说Serializable接口,然后才是parvelable接口。两个接口相类似,有什么区别?

Parcelable和Serializable的作用、效率、区别及选择:
1、作用
Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也
可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android
程序间()高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。
从上面的设计上我们就可以看出优劣了。

2、效率及选择
Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,
而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能
不同,所以不推荐使用Parcelable进行数据持久化

3、编程实现
对于Serializable,类只需要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)即可。而Parcelable则需要实现
writeToParcel、describeContents函数以及静态的变量,实际上就是将如何打包和解包的工作自己来定义,而序列化的
这些操作完全由底层实现。

Parcelable接口的作用:实现了Parcelable接口的实例可以将自身的状态信息(状态信息通常指的是各成员变量的值)写入Parcel,也可以从Parcel中恢复其状态。Parcel用来完成数据的序列化传递。

2.实现Parcelable就是为了进行序列化,那么,为什么要序列化?
1)永久性保存对象,保存对象的字节序列到本地文件中;
2)通过序列化对象在网络中传递对象;
3)通过序列化在进程间传递对象。

3.Parcelable接口定义

public interface Parcelable
{    //内容描述接口,基本不用管
public int describeContents();    //写入接口函数,打包
public void writeToParcel(Parcel dest, int flags);    //读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。
//因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入
//为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例
public interface Creator<T>
{
public T createFromParcel(Parcel source);
public T[] newArray(int size);
}
}

4.实现Parcelable接口

首先看一个简单的实现例子:

package com.example.root.pracact;

import android.os.Parcel;
import android.os.Parcelable;

/**
* Created by root on 15-8-14.
*/
public class MyParcelable implements Parcelable {

private String str;
private int in;

public MyParcelable(String str, int in) {
this.str=  str;
this.in = in;
}
//首先定义要传递的数值变量

public String getStr() {
return str;
}

public void setStr(String str) {
this.str = str;
}

public void setIn(int in) {
this.in = in;
}

public int getIn() {
return in;
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(str);
dest.writeInt(in);
}
//write操作把数据写入parcel中

public static final Creator<MyParcelable> CREATOR = new Creator<MyParcelable>() {
@Override
public MyParcelable createFromParcel(Parcel source) {
return new MyParcelable(source.readString(),source.readInt());
}
//读取parcel的数据,对parcel中的数据进行还原,这样我们就具有了一个有和传入的MyParcelbale对象有着相同实例变量值的
// 还原后的MyParcelable对象,这样就实现了对象的传递。

@Override
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
}

有了这个基础,我们看一下在两个activity中进行传递数值的例子

第一个是User类,在这个user类中实现了parcel的写入与还原

com.example.root.pracact;

android.os.Parcel;
android.os.Parcelable;

User Parcelable{
String ;
;

setAge(age) {
.= age;
}

getAge() {
;
}

setName(String name) {
.= name;
}

String getName() {
;
}
User(String name,age){
.= name;
.= age;
}

describeContents() {
;
}

writeToParcel(Parcel dest, flags) {
dest.writeString(getName());
dest.writeInt(getAge());
}

Creator<User> = Creator<User>() {
User createFromParcel(Parcel source) {
User(source.readString(),source.readInt());
}

User[] newArray(size) {
User[size];
}
};
}

com.example.root.pracact;

android.content.Intent;
android.support.v7.app.ActionBarActivity;
android.os.Bundle;
android.view.Menu;
android.view.MenuItem;
android.view.View;

java.io.Serializable;

MainActivity ActionBarActivity {

onCreate(Bundle savedInstanceState) {
.onCreate(savedInstanceState);
setContentView(R.layout.);
findViewById(R.id.).setOnClickListener(View.OnClickListener() {
onClick(View v) {
Intent i = Intent(MainActivity.,AnotherAct.);i.putExtra(, User(,));startActivity(i);
}
});
}

onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu., menu);
;
}

onOptionsItemSelected(MenuItem item) {
id = item.getItemId();

(id == R.id.) {
;
}

.onOptionsItemSelected(item);
}
}

com.example.root.pracact;

android.content.Intent;
android.support.v7.app.ActionBarActivity;
android.os.Bundle;
android.view.Menu;
android.view.MenuItem;
android.widget.TextView;

AnotherAct ActionBarActivity {

TextView ;
onCreate(Bundle savedInstanceState) {
.onCreate(savedInstanceState);
setContentView(R.layout.);
= (TextView) findViewById(R.id.);
Intent i =getIntent();
User user =  i.getParcelableExtra();
.setText(String.(,user.getName(),user.getAge()));
}

onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu., menu);
;
}

onOptionsItemSelected(MenuItem item) {
id = item.getItemId();

(id == R.id.) {
;
}

.onOptionsItemSelected(item);
}
}

钟志远 江苏南京 904727147
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: