前言:在某个旧项目中使用到了aidl进行跨进程通信,这里把他的实现流程简单地整理一下方便有相同需求的小伙伴参考。
一、开启一个单独进程的Service
方法很简单,在 manifest 文件中注册时指定 process 名称即可
<service
android:name=".Other.Service.AidlService"
android:process=":aidl"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.lxt.single_module.Aidl.MyAidl" />
</intent-filter>
</service>
二、定义aidl文件
1. 启用aidl
需要在 build.gradle 的 buildFeatures 字段中启用 aidl
buildFeatures {
aidl = true // 启用 aidl
}
2. 创建aidl目录
3. 创建aidl文件
4. 定义aidl接口
这里先用一个简单的例子作为参考
interface MyAidl {
void sendMessage(String message);
}
定义完成之后记得编译一下
三、在Activity与Service中实现
1. Service中实现
实现 MyAidl.Stub 对象并在onBind方法返回
private final MyAidl.Stub mBinder = new MyAidl.Stub() {
@Override
public void sendMessage(String message) throws RemoteException {
Log.e(TAG, "received aidl msg from activity: "+message);
}
};
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
2. Activity中实现
private var aidlService: MyAidl? = null
private var aidlServiceRunning = false
private val aidlServiceConnection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName, binder: IBinder) {
aidlService = MyAidl.Stub.asInterface(binder)
aidlServiceRunning = true
loge("绑定AIDL服务")
}
override fun onServiceDisconnected(name: ComponentName) {
aidlService=null;aidlServiceRunning = false;loge("解绑AIDL服务")
}
}
fun bindMQTTService(){
val intent = Intent(this, AidlService::class.java)
bindService(intent, aidlServiceConnection, Context.BIND_AUTO_CREATE)
}
3. 通信
在Activity中绑定Service成功后使用aidl文件中定义的方法即可
viewBinding.countDown.setOnClickListener {
aidlService?.let {
it.sendMessage("测试文本")
}
}
在Service中实现的方法处理收到的数据
@Override
public void sendMessage(String message) throws RemoteException {
Log.e(TAG, "received aidl msg from activity: "+message);
}
以上就是一个简单的通过aidl传输String类型数据实现例子,此外还有双向互通和传输自定义对象的例子有空再补充