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

相關文章
相關標籤/搜索