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