第一次用到这个序列化Parcelable,是想Intent 跳转时传对象,可是明显能看出bundle里只能存8个基本类型和对应数组的数据以及序列化的对象和数组。 html
这里提供了2中序列化的方式,一种是java提供的api接口Serializable,另外一种是android自带api接口Parcelable(但推荐用这个接口)。具体有啥区别,这里有篇博客讲的很是详细。
http://www.cnblogs.com/trinea/archive/2012/11/09/2763213.html
java
这里记录下Parcelable实现序列化和2种经常使用用途。第一状况就是上面讲的在Intent或handler传对象;第二种状况在aidl中,是不认识这些自实现的对象的,必须序列化以后才能使用。 android
下面是一个存储安装信息对象,由于要提供给外部应用查询。因此就用了个aidl接口,查询数据库后返回这对象给外部应用。下面是基本序列化代码: 数据库
import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; import android.provider.BaseColumns; public class InstalledAppInfo implements Parcelable,BaseColumns{ public static final String AUTHORITY = "com.outquery.DBProvider"; public static final Uri CONTENT_URI = Uri.parse("content://"+AUTHORITY+"/appinfos"); // 表字段 public static final String APP_ID = "appId"; public static final String APP_NAME = "app_name"; public static final String APP_PKNAME = "app_pkname"; public static final String APP_TYPENAME = "app_typename"; private String appId, app_name,app_pkname,app_typename; public String getAppId() { return appId; } public void setAppId(String appId) { this.appId = appId; } public void setApp_name(String app_name) { this.app_name = app_name; } public String getApp_name() { return app_name; } public String getApp_pkname() { return app_pkname; } public void setApp_pkname(String app_pkname) { this.app_pkname = app_pkname; } public String getApp_typename() { return app_typename; } public void setApp_typename(String app_typename) { this.app_typename = app_typename; } @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flag) { dest.writeString(appId); dest.writeString(app_name); dest.writeString(app_pkname); dest.writeString(app_typename); } public InstalledAppInfo() {} public InstalledAppInfo(Parcel parcel) { appId = parcel.readString(); app_name = parcel.readString(); app_pkname = parcel.readString(); app_typename = parcel.readString(); } //必须建立Creator,且声明为publlic public static final Parcelable.Creator<InstalledAppInfo> CREATOR = new Parcelable.Creator<InstalledAppInfo>() { @Override public InstalledAppInfo createFromParcel(Parcel in) { return new InstalledAppInfo(in); } @Override public InstalledAppInfo[] newArray(int size) { return new InstalledAppInfo[size]; } }; }
同时,还要建立一个InstalledAppInfo.aidl文件,只有一句代码,告诉系统咱们须要序列化的对象类型。编译器在编译aidl接口时,会自动查找这个aidl文件。但它并不会和其余aidl接口同样生成一个.java文件。 api
parcelable InstalledAppInfo;
在供外部应用使用时,把这序列化的对象代码InstalledAppInfo.java和InstalledAppInfo.aidl同调用的aidl接口同时发给外部应用,而且保证包名一致。
自此,简单的序列化实现了。外部应用能正常调用aidl接口了。并返回这个对象,直接使用便可。下面是给外部调用的aidl接口: 数组
package com.outquery; import com.outquery.InstalledAppInfo; interface IQueryAppsService { //query List<InstalledAppInfo> getInstalledAppInfos(); }最后总结下几种经常使用到序列化对象的状况:
1.Intent 传值 app
2.handler传值 ide
3.aidl接口返回值 this