一、概念
二、使用
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)