安卓在新进程中开启服务并与原进程通信

最近有个需求是要将某个Activity里的一部分逻辑作为服务抽出来并放到一个新进程中执行,执行结果要再回调到主进程。
我使用aidl来实现跨进程通信,这种方式最灵活。

1.定义aidl文件

因为我们需要回调,所以需要再定义一个回调的aidl,注意需要在src/main/aidl文件夹下,编译后会生成带Stub和Default的类

2.创建Service

在AndroidManifest中你定义的服务要加上android:process=":remote"意思是要将服务放到新的进程中,:的意思是进程是app私有的,名字是包名:你定义的名字,remote这个名字是自己定的
在你的服务中定义一个mBinder,继承你生成的aidl文件的Stub类,然后实现逻辑,回调这里需要用到RemoteCallbackList,重点就是每次回调都要beginBroadcast()和finishBroadcast(),beginBroadcast会返回注册的客户端数量,中间循环去取出客户端注册的回调,然后调用回调内你需要返回数据的函数,getBroadcastItem(i).onReceived(xxx,xxx…)这个函数你自己定义,客户端需要实现 回调.Stub 之后,注册给服务端。

3.客户端

bind一下即可,记得去注册回调函数,以及页面销毁后去unregister这个回调

还有一点就是服务放在新进程中会有一些问题,自定义的Application多次创建,生命周期会混乱,如果你在onCreate做了初始化工作,它会再做一遍,不同进程拥有各自独立的虚拟机,Application,内存空间,所以可能会引发一些问题

我的这个项目中并没有application类,所以没有考虑application生命周期的问题,如果有,可以根据pid做些处理。在原activity里的一些初始化工作,比如去绑定一些必要的服务,这些同样需要在新服务中再做一遍。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值