本文将以一个简单的 AS 工程实例,使用 AIDL 实现进程间通信(Inter-Process Communication,IPC),中间穿插介绍必要的技术理论和 AS 操作步骤。
第一部分 Parcelable 的理解与实现
(1) IPC 中对数据进行序列化的原因:
Java 中,除了基本数据类型,包括 byte,char,short,int,long,float,double,boolean,其他类型的对象,无法通过 IPC 直接传输。“ 序列化 ” 的出现就是为了解决这个问题。在两个进程中包含同一个类的相同定义的前提下,只有进行了“序列化”,相应的数据对象在传递到目标进程后,才能依据 “ 序列化 ” 的准则将数据流正确 “ 反序列化 ” 为最终的被传对象。注意,IPC 过程中,不同进程中的两个对象,对象内容虽然相同,但是,不是同一个对象。
(2)Java 中的 “ 序列化 ”:实现 Serializable 接口
class Test implements Serializable {
private static final long serialVersionUID = 0;
...
}
使用 Serializable 接口实现序列化,只需要注意两点:
第一点:implements Serializable
第二点:定义 private static final long serialVersionUID = 0;
第二点serialVersionUID 如果不定义,有可能导致反序列化失败,或者引起其它异常。
(3)Android中提供的 “序列化”方案:实现Parcelable接口
package com.xxx.sarcontrol;
import android.os.Parcel;
import android.os.Parcelable;
public class SarStatus implements Parcelable {
public boolean mChargerConnected;
public boolean mEarPiece;
public boolean mVoiceCall;
public boolean mDataCall;
public boolean mConnection;
public boolean mWifi;
public boolean mMifi;
public boolean mWifiDirect;
public boolean mAirPlaneMode;
public boolean mRfCable;
public boolean mOB5State;
public boolean mTX0State;
public int mSarState;
public int mWifiCutbackUsed;
public int[] mSensorState = null;
public SarStatus() {
}
protected SarStatus(Parcel in) {
mChargerConnected = in.readInt() == 1;
mEarPiece = in.readInt() == 1;
mVoiceCall = in.readInt() == 1;
mDataCall = in.readInt() == 1;
mConnection = in.readInt() == 1;
mWifi = in.readInt() == 1;
mMifi = in.readInt() == 1;
mWifiDirect = in.readInt() == 1;
mAirPlaneMode = in.readInt() == 1;
mRfCable = in.readInt() == 1;
mOB5State = in.readInt() == 1;
mTX0State = in.readInt() == 1;
mSarState = in.readInt();
mWifiCutbackUsed = in.readInt();
int length = in.readInt();
if(length > 0){
mSensorState = new int[length];
in.readIntArray(mSensorState);
}
}
public static final Creator<SarStatus> CREATOR = new Creator<SarStatus>() {
@Override
public SarStatus createFromParcel(Parcel in) {
return new SarStatus(in);
}
@Override
public SarStatus[] newArray(int size) {
return new SarStatus[size];
}
};
@Override
public int describeContents() {
return 0;
}