Android——AIDL进程通信记录(复杂数据类型)
记录一下;自定义对象的传递;
AIDL中传递自定义对象必须使用Parcelable来序列化;而不能使用Serializable
服务端:
一,传递对象,首先将对象进行序列化,然后使用aidl来将对象进行标记;标记包名,还有序列化的类型
1,对象序列化
public class StudentBean implements Parcelable { private String name; private int age; private long number; protected StudentBean(Parcel in) { name = in.readString(); age = in.readInt(); number = in.readLong(); } public static final Creator<StudentBean> CREATOR = new Creator<StudentBean>() { @Override public StudentBean createFromParcel(Parcel in) { return new StudentBean(in); } @Override public StudentBean[] newArray(int size) { return new StudentBean[size]; } }; public StudentBean(String name, int age, long number) { this.name = name; this.age = age; this.number = number; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); dest.writeLong(number); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public long getNumber() { return number; } public void setNumber(long number) { this.number = number; } @Override public String toString() { return "StudentBean{" + "name='" + name + '\'' + ", age=" + age + ", number=" + number + '}'; } }
2,AIDL标记
二,对外接口暴漏
三,远程服务
客户端:(需要将Bean的文件,aidl文件都要拷贝过来;放在对应的包名之下)
与远程服务建立连接就可以了
Intent intent = new Intent(); intent.setAction("com.roi.audio2video.remote_server.ServerTwo"); intent.setPackage("com.roi.audio2video"); bindService(intent,new MyServiceConnection(),BIND_AUTO_CREATE);
private class MyServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { LogUtils.e("rrrrrrrr","连接上"); iRemoteOne = IRemoteTwo.Stub.asInterface(service); if (iRemoteOne != null) { LogUtils.e("rrrrrrrr","不为空"); }else { LogUtils.e("rrrrrrrr","为空"); } } @Override public void onServiceDisconnected(ComponentName name) { } }
拿到句柄之后调用函数进行数据打印就可以了
try { List<StudentBean> mdata = iRemoteOne.addStudentBean(new StudentBean("张三", 12, 001)); LogUtils.e("rrrrrrrr",mdata.toString()); } catch (RemoteException e) { e.printStackTrace(); }