简介
进程间通讯相信大家的比较熟悉,而广为人知的通讯有两种,一种就是通过AIDL文件编写通讯接口,另一种就是今天我要说的Messenger。其实Messenger就是基于AIDL实现的,不懂的自行百度。
作用
当一个app的功能越来越多,越来越复杂,那么是不是需要更多资源和时间去处理呢?那是肯定的,但一个进程能获得的资源是有限的,而且这个进程既要负责ui绘制又要进行复杂运算,想想就知道继续这样下去你的app只会越来越卡,只显然不符合用户的期望。所以多进程概念应运而生,将ui绘制和逻辑运算放到不同进程里进行,那么影响ui卡顿的问题就只有控件的性能这个因素了。而且逻辑运算报错导致崩溃不再影响ui,ui正常使用,提高应用整体稳定性。
实现
开启一个远程Services充当本地服务器,用于处理客户端发送的计算请求(这里的客户端指代ui)。Services的配置如下图所示,使用process属性定义其为一个远程服务。
Activity与Services交互方式就两种,stratSerices和bindServices,这里我采用的是bindServices方式,传入的上下文为Application,这样使得这个服务的生命周期与app一致。
具体的连接逻辑如下图所示:
connect()方法就是调用bindServices方法和开启一个线程经行轮询(检查当前是否有客户端请求),这里还包含了一个重连机制,防止远程服务器崩溃后app无法继续请求数据。
客户端与服务器连接上了之后就可以开始通讯,通讯需要什么?需要协议,通过协议来识别客户端的请求,协议的实现如下所示:
这里我只写了一个协议用于测试,后续新增只需在这里定义协议号和对应的协议处理器即可。getResult方法由服务器调用,运算对应协议的计算代码。handleResult方法由客户端调用,使用返回的数据更新界面。
具体协议定义如下:
首先是协议号,然后就是各种参数,使用Bundle来传输
demo已上传到Github,大家自行查看点击这里