概述
我们在应用层使用会遇到需要进行数据传输的时候,通常都是使用的intent方式,如果使用基本点的数据类型(String\int\boolean)都是可以直接传的,但是如果传输的数据是一个类的话,下面的方式就不行了。Parcelable在android当中通常用的intent和binder通信当中,通常通过读和写的方式来进行服务器和客户端的通信(数据传输)。这个是android专有的类型
//在第一个Activity中向Intent中加入内容String data = "Hello,SecondActivity.class");
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("key","我的数据");
startActivity(intent);
//在第二个Activity中,取出Intent中的内容
Intent intent = getIntent();
String data = intent.getStringExtra("alarm");
在java当中也是有这么一种类型的叫Serializable,它是javaSE本身就支持的序列化接口,但是使用这个接口来进行序列化有一个缺点,因为这个的序列化和樊序列化也就是读写需要达大量的IO操作,从而是的效率大大降低,但它也是有优点的就是使用起来非常的方便,只要implement Serializable即可,细听会自动帮你序列化和反序列化, 所以鱼和熊掌不可兼得。所以android设计了另外一个接口Parcelable。parcelable定义了把数据写入parcel和从parcel读出数据的接口,一个类的实例,如果需要封装到消息中去,就必须实现这一接口,如果实现了这个接口,该类的实例就是可以“被打包”。parcelable使用起来就相对麻烦一些。
这个时候我们也会问为什么要序列化呢,序列化能给我们带来什么好处呢?
- 永久行的保存对象,保存对象的字节的序列到本地文件道中;
- 通过序列化对象在网络中传输
- 通过序列化对象在进程间通信
看看 Parcelable 接口里面是什么东东,
public interface Parcelable
{
//内容描述接口,可以不做任何操作,直接return 0即可;
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);
}
}
实现Parcelable步骤
- 首先 必须要 implement Parcelable
- 重写describeContents方法,内容接口描述,默认返回0就可以
- 重写writeToParcel 方法,将你的对象序列化为一个Parcel对象,即:将类的数据写入外部提供的Parcel中,打包需要传递的数 据到Parcel容器保存,以便从 Parcel容器获取数据;
- 实例化静态内部对象CREATOR实现接口Parcelable.Creator:
实现了的例子
package com.xxx.storybox.model;
import android.os.Parcel;
import android.os.Parcelable;
public class ApplicationMusicItem implements Parcelable {
public static final int MUSIC_TYPE_LOCAL = 0;
public static final int MUSIC_TYPE_REMOTE = 1;
public static final int MUSIC_TYPE_CLOUD = 2;
// common
protected int type;
protected String title;
protected String url;
protected String artist;
protected String album;
protected String albumArt;
protected String genre;
protected int duration;
protected boolean isChecked = false;
protected static int mMemberSize = 9;
public ApplicationMusicItem() {
}
public static int memberSize() {
return mMemberSize;
}
public void setType(int type) {
this.type = type;
}
public int getType() {
return type;
}
public void setTitle(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getArtist() {
return artist;
}
public void setAlbum(String album) {
this.album = album;
}
public String getAlbumArt() {
return albumArt;
}
public void setAlbumArt(String albumArt) {
this.albumArt = albumArt;
}
public String getAlbum() {
return album;
}
public void setGenre(String genre) {
this.genre = genre;
}
public String getGenre() {
return genre;
}
public void setDuration(int duration) {
this.duration = duration;
}
public int getDuration() {
return duration;
}
public void setUrl(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
public static int transactionMemberSize() {
return mMemberSize;
}
public static ApplicationMusicItem createFromTransactionArray(String[] array) {
ApplicationMusicItem entry = new ApplicationMusicItem();
entry.title = array[0];
entry.url = array[1];
entry.artist = array[2];
entry.album = array[3];
entry.albumArt = array[4];
entry.genre = array[5];
entry.duration = Integer.valueOf(array[6]);
return entry;
}
public String[] toTransactionArray() {
String[] array = new String[transactionMemberSize()];
array[0] = title;
array[1] = url;
array[2] = artist;
array[3] = album;
array[4] = albumArt;
array[5] = genre;
array[6] = Integer.toString(duration);
return array;
}
protected ApplicationMusicItem(Parcel in) {
this();
type = in.readInt();
title = in.readString();
artist = in.readString();
album = in.readString();
genre = in.readString();
duration = in.readInt();
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(type);
out.writeString(title);
out.writeString(url);
out.writeString(artist);
out.writeString(album);
out.writeString(albumArt);
out.writeInt(duration);
out.writeString(genre);
out.writeString(albumArt);
}
public static final Creator<ApplicationMusicItem> CREATOR = new Creator<ApplicationMusicItem>() {
public ApplicationMusicItem createFromParcel(Parcel in) {
return new ApplicationMusicItem(in);
}
public ApplicationMusicItem[] newArray(int size) {
return new ApplicationMusicItem[size];
}
};
@Override
public String toString() {
return "MusicItem{" +
"type=" + type +
", title='" + title + '\'' +
", url='" + url + '\'' +
", artist='" + artist + '\'' +
", album='" + album + '\'' +
", albumArt='" + albumArt + '\'' +
", genre='" + genre + '\'' +
", duration=" + duration +
", isChecked=" + isChecked +
'}';
}
}
如何使用:
Intent intent = new Intent(A.class,B.class);
Bundle bundle = new Bundle();
bundle.putParcelable("contentNavInfo", contentNavInfo);
intent.putExtras(bundle);
网友评论