android 序列化Parcelable

第一次用到这个序列化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

Parcelable序列化

下面是一个存储安装信息对象,由于要提供给外部应用查询。因此就用了个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

相关文章
相关标签/搜索