一、概念
二、使用
2.1 Server 端
2.1.1 创建 .aidl 文件
Module右键→New→AIDL→AIDL File(如果不可选,在build.gradle的buildFeatures节点添加aidl true)。
在创建的接口中定义抽象方法。
interface IDemoAidlInterface {
//自己的业务
void setName(String name);
String getName();
}
Rebuild一下,就会生成对应的Java类。Android目录在 java(generated) 里,Program目录在 build/generated/aidl_source_output_dir 里。
2.1.2 创建 Service 对外暴露接口
别忘了在 AndroidManifest 中注册Service。
class DemoService : Service() {
override fun onBind(intent: Intent): IBinder {
return IDemoImpl() //返回实现类对象
}
//实现接口(注意是.Stub)
class IDemoImpl : IDemoAidlInterface.Stub() {
private var name: String = "成功了!"
override fun setName(name: String?) {
this.name = name.orEmpty()
}
override fun getName(): String = name
}
}
2.2 Client 端
2.2.1 复制 .aidl 文件
Moudle右键→New→Filder→Aidl Folder 新建文件夹,然后创建和 Server 端相同的包名将 Server 端的 .aidl 文件复制粘贴过去,最后Rebuild一下。
2.2.2 AndroidManifest 配置权限
除了之前创建的 Service 需要注册,还要添加查询包的权限,包名是 Server 端的。
2.2.3 启动服务调用API
val conn = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
//拿到对象就可以调用各种方法了
val demoBinder = IDemoAidlInterface.Stub.asInterface(service)
}
override fun onServiceDisconnected(name: ComponentName?) {}
}
//开启服务
val intent = Intent()
intent.component = ComponentName("com.jomuiphys.service.service", "com.jomuiphys.service.service.DemoService")
context.bindService(intent, conn, AppCompatActivity.BIND_AUTO_CREATE)