在Android中,当我们要进行两个程序的互通时,就涉及到了进程通讯的内容。我们都知道进程间通讯要使用的是Binder,而Binder实现的接口语言正是AIDL。所以我们在这边博客中一起学习一下如何使用AIDL进行进程间通讯。
1.创建类Person,并实现Parcelable接口,实现实体的序列化,跨进程通信使用。代码如下:
public class Person implements Parcelable {
private String mName;
protected Person(Parcel in) {
mName = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mName);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
}
2.在main文件夹下新建一个aidl文件夹
aidl下的文件夹结构要与Person实体类的结构一致。
这个aidl文件名为Person.aidl,代码如下
package com.example.jiajiemu,test.bean;
parcelable Person;
3.在包名下创建另一个aidl文件,该文件创建了之后跨进程通信要调用的方法。
代码如下:
package com.example.jiajiemu.test;
import com.example.jiajiemu.test.bean.Person;
interface IMyAidl{
void addPerson(in Person person);
List<Person> getPersonList();
}
4.make project
会生成一个IMyAidl的java文件。
5.新建一个service
在这个Service中我们创建一个IBinder的内部类,代码如下:
private IBinder mIBinder = new IMyAidl.Stub(){
@Override
public void addPerson(Person person) throws RemoteException{
mPersons.add(person);
}
@Override
public List<Person> getPersonList() throws RemoteException{
return mPersons;
}
}
6.重写onBind方法
@Nullable
@Override
public IBinder onBind(Intent intent){
mPerson = new ArrayList<>();
return mIBinder;
}
这个是客户端与服务端绑定时的回调,返回mIBinder后客户端就可以通过它远程调用服务端代码。
7.进入Activity,即客户端
<1>实现ServiceConnection接口
onServiceConnected方法中:
mAidl = IMyAidl.Stub.asInterface(service);
onServiceDisconnected方法中
mAidl = null;
<2>使用bindService绑定服务
<3>使用对应方法,即服务端定义好的方法
mAidl.addPerson(person);
personList = mAidl.getPersonList();