AIDL : Android Interface Define Language(接口定义语言)
Service中跨进程间通信利器。。。。
一般都会有Client端和Server端(Server端提供服务)
实现步骤
1、在Server模块 main文件夹下新建一个aidl文件夹,创建AIDL文件接口,并在Client中相同位置建立相同的包,相同的AIDL文件
2、编译之后会在build-generate-source下生成一个aidl文件夹
3、编写Service
public class IRemoteService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { return binder; } private IBinder binder=new IMyAidlInterface.Stub(){ @Override public int plus(int a, int b) throws RemoteException { return a+b; } }; }
4、在AndroidManifest文件中注册该Service,并设置Exported属性为true,否则无法被调用
5、Client中调用
Intent i=new Intent(); i.setComponent(new ComponentName("com.alger.lu_yy.myaidl","com.alger.lu_yy.myaidl.IRemoteService"));//包名及类名 bindService(i, new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { iMyAidlInterface=IMyAidlInterface.Stub.asInterface(service); //将IBinder转成Aidl接口 try { int count= iMyAidlInterface.plus(10,2); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { iMyAidlInterface=null; } },BIND_AUTO_CREATE);
注意:发现在Aidl文件中是无法引入相关的类的,能传递的类型有:基本数据类型(short除外),List及Map 这些都是无需Import的,当我们需要传递一些自定义的数据类型时?该如何使用呢?
1、在java文件夹下建立与aidl文件下相同的包,创建相关的类,并实现Parceable接口
public class Person implements Parcelable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } protected Person(Parcel in) { this.age=in.readInt(); this.name=in.readString(); } 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]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); } }
2、在aidl文件夹下建立相应的Person.aidl文件,里面写入
parcelable Person;(parceleable必须要小写)
3、并且在Aidl文件中传递自定义的数据类型时必须在类型前面加入in out 关键词
4、同样在Client模块中相同位置建立相同的类及Aidl文件