最近有个需求是要将某个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里的一些初始化工作,比如去绑定一些必要的服务,这些同样需要在新服务中再做一遍。