发布网友 发布时间:2022-09-01 19:05
共1个回答
热心网友 时间:2024-12-01 19:18
在某些业务场景下,我们需要在应用中单独开启一个进程进行一些操作。比如性能监控,如果让原始业务和性能监控本身的业务跑在同一个进程下,那么就会导致性能统计的数据的失真。
而进程间通信,一般采用AIDL机制的客户端与服务端通信。
AIDL只能传递如下几类数据:
当传递自定义 Parcelable 时,有三处地方需要注意:
当传递其他 aidl 接口时,同样必须要 import 这个 aidl 文件
编写完 aidl 文件后,make一下工程,会在 build 下的 generated 下的 source 下的 aidl 目录生成对应的接口类文件。aidl 接口其实就是 API 接口,通过实现对应接口类的 Stub 子类来实现具体的 API 逻辑;通过对应接口类的 Stub 子类的 asInterface 方法得到具体的实现类,调用具体的 API 方法。
一个基本的客户端服务端的通信结构一般包括如下功能
客户端的功能
服务端的功能
客户端的相关功能实现比较简单,麻烦的是服务端的功能。因为 AIDL 接口定义的都是服务端的接口,是由客户端来调用的。而想要实现服务端反向调用客户端则需要通过其他手段实现。
想要实现服务端主动连接客户端,最好的办法就是服务端发送广播,客户端收到广播后再主动连接服务端,通过这种方式变相地实现服务端主动连接客户端的功能
想要实现服务端主动断开客户端,除了上面发送广播是一种实现方式外,还可以通过 android 的系统API RemoteCallbackList,用包名作为key值来注册远程回调接口的方式,让服务端持有客户端的回调接口,服务端调用回调接口,客户端在回调接口中实现主动断开服务端,通过这种方式变量地实现服务端主动断开客户端的功能。而采用后者会显得更加优雅
既然所有的操作归根结底都是由客户端来完成的,那么客户端必须得有如下的功能模块:
服务端必须得有的功能模块:
那么,整体的通信流程就是如下的步骤:
首先是通信的 aidl 接口定义
然后是客户端的连接操作与断开连接操作,包括广播接收者的注册以及回调接口的实现
然后是客户端的拉取数据和推送数据操作
接着是服务端的 iBinder 接口的实现,完成回调接口的注册、业务子线程的开启和关闭、数据的推送和数据的拉取操作
然后是服务端的主动连接和主动断开连接操作
最后是服务端的 onUnbind 方法的实现,对回调接口进行反注册
服务端模仿 FloatViewPlugin 自定义插件,实现 IServicePlugin 接口,定制个性化的悬浮窗插件
客户端在 Appliaction 的 onCreate方法中初始化
在 MainActivity 上实现连接、断开、数据通信