一、AIDL的语法
首先,介绍一下AIDL的语法。
AIDL的语法与Java的接口写法十分类似,甚至可以说一模一样,但也有细微的区别,总结如下:
- 不能使用private、public、protect修饰方法;
- 支持传递数据类型有:java基本数据类型(byte、short、int、long、float、double、char、boolean)、String、CharSequence、List(接收方必须是ArrayList)、Map(接收方必须是HashMap)、其他AIDL定义的AIDL接口、实现Parcelable序列化的类;
- .其他AIDL定义的AIDL接口和实现Parcelable序列化的类必须import,即使在相同包结构下,其余的类型不需要import;
- 对于非基本数据类型,也不是String和CharSequence类型的,需要有方向指示,包括in、out和inout,in表示由客户端设置,out表示由服务端设置,inout是两者均可设置。
二、AIDL使用
AIDL的使用分为服务端和客户端,由服务端创建service。首先我们来实现服务端的创建和AIDL创建。
注意
基本开发流程:先开发Service端,后开发Client端
使用AndroidStudio创建AidlDemo工程后,再在里面创建Service Module和Client Module,不用管默认的app Module
如下图,右键New创建AIDL文件,会直接生成一个AIDL模板类IService.aidl。
Service端
包名: com.studyhelper.aidl
1、创建aidl文件,如:IMyAidlInterface.aidl,新增接口,void PowerOff();
2、检查build/generated/source/aidl/debug下是否存在对应的java文件,若无则Rebuild Project
3、创建继承于android.app.Service的Service类,如:MyService.java,并实现必须要实现的onBind方法
package com.studyhelper.aidl;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import static android.content.Intent.ACTION_REQUEST_SHUTDOWN;
import static android.content.Intent.EXTRA_KEY_CONFIRM;
public class MyService extends Service {
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return iMyAidlInterface;
}
private IMyAidlInterface.Stub iMyAidlInterface=new IMyAidlInterface