您的位置:首页 > 其它

Messenger

2016-07-04 23:39 225 查看
说到Android进程间通信,一般我们会想到采用aidl方式实现。今天我们介绍一种新的轻量级进程间通信方式——Messenger。不过,它实质上是对aidl进行封装,请听我细细说来。

1实现机制

我们首先来看一张实现图


从上图可以看出,Client和Server之间的通信,都是基于Messenger来提供服务,这样我们就不同再使用AIDL来进行进程间通信了(IPC)。

2具体使用

Server端

创建一个自定义Service,来作为服务器端



注意上述的handleMessage()方法,这个是服务端用来接收Message的地方,然后根据what来决定来自哪里的操作。

Client端

客户端需要做的全部工作就是根据服务返回的IBinder创建一Messenger,并使用send()方法发送一个消息。以下Activity为例,它绑定了该服务,并向服务器端发送MSG_SAY_HELLO的消息:



服务器端返回数据

上面讲到的是创建了Server端和Client端,以及Client向Server发送了数据,但Server如何给Client发送数据呢?你需要在Client做以下步骤:

创建Messenger

Client端也创建一个Messenger,用来接收Server端发送过来的消息,具体创建如下:



发送Messenger给Server

Client端创建完Messenger后,需要在onServiceConnected创建连接时,将Client端的Messenger发送给Server端,具体如下,赋值给Message的replyTo



Server端接收Client端的Messenger并发送消息

如下所示,接收到Client端的Messenger后,就保存起来,然后需要给Client发消息时,就通过保存的Messenger来给Client端发消息。



3使用案例

我们公司的产品在使用一些系统API,有随机的系统crash发生。涉及到系统层crash的,尤其是动态库crash,一般都没法解决。比如下面的crash



作为APP层,碰到上面这样的问题,只能主动放弃了~ 但是稍微细想一下,crash只是对当前进程有影响,如果我们在应用里面再开一个子进程,将会crash的代码放到子进程执行。这样,即使出现crash,对主进程也没影响。所以,我们可以在AndroidManifest.xml 声明一个敢死进程(弃卒保帅):

<com.my.test.DoNotCareCrashService

android:process=":fork_process"/>

如果,在DoNotCareCrashService的执行结果需要返回给主进程的时候,那么就可以采用基于Messenger的通信喽。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: