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的通信喽。
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的通信喽。
相关文章推荐
- windows编程之线程操作
- 使用Storyboard时出现以下警告:Scene is unreachable due to lack of entry points and does not have an identifier
- 2.1 合格的代码
- The system cannot find the file specified
- 标准c执行批处理命令
- Android脱壳圣战之---如何脱掉"爱加密"家的保护壳
- Spring AOP 原理分析 2 动态代理
- hdu 3535 (最少1,最多1,任意)(背包混合)(好题)
- 高斯混合模型GMM的EM算法实现(聚类)
- android 下载模拟器镜像文件遇到的问题
- Could not find C:\sdk\android-2.1_r01-windows(android SDK)\tools\adb.exe!
- hadoop随笔三之hive2.1安装(元数据存储oracle)
- QT error: cannot find -lGL
- 思维导图的工具
- 第k个数
- HTTP与HTTPS的区别
- 对WEB标准以及W3C的理解与认识?
- touch事件
- 产品助理实习day1
- 时间效率为O(n)的特殊排序算法-剑指offer