Android开发,使用AIDL跨进程通信

前言:在某个旧项目中使用到了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类型数据实现例子,此外还有双向互通和传输自定义对象的例子有空再补充

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值