当前位置: 首页 > news >正文

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

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


http://www.mrgr.cn/news/18713.html

相关文章:

  • Postgres容器使用
  • 地铁X光危险品检测数据集
  • 医院安全用电全套解决方案
  • HTTP 请求方法(method)介绍
  • 【清华Vul337】招**隐私计算**方向实习生啦~
  • 【RabbitMQ】核心概念
  • 史上最全能的云原生开发工具 —— TitanIDE,从此告别加班
  • HNU OS实验七
  • C++ 有限元状态机
  • 【unity知识】Animator动画状态的基本属性介绍
  • 9.2C++
  • 使用Pinia作为状态管理库来存储用户登录的token
  • OI-Beats 中级信息学竞赛 Wiki 发布
  • 数据分析-MAC 编程环境安装教程
  • GPT-4 vs LLaMA3.1:核心技术架构与应用场景对比
  • Endtest使用体验
  • Anaconda安装和环境配置教程(深度学习准备)
  • 如何实现对窗口window的viewtree进行dump Hierarchy-安卓framework实战开发
  • Linux\Docker部署Postgres
  • 开源模型应用落地-LlamaIndex学习之旅-LLMs-集成vLLM(一)