利用Messenger跨进程通信

 我来答
天罗网17
2022-07-30 · TA获得超过6130个赞
知道小有建树答主
回答量:306
采纳率:100%
帮助的人:70.4万
展开全部
Android笔记多进程通信之利用Messenger跨进程通信,

    提起跨进程通信,大多数人首先会想到AIDL,AIDL,中文名称是android接口描述语言,是android系统中用于进行跨进程通信必须了解的。其实messenger和AIDL作用一样,都可以进行进程间通讯。它是基于消息的进程间通信,通过构建Message来在客户端和服务端之间传递数据,就像Handler发送消息在子线程和UI线程发送消息那样,还不用去写AIDL文件。

    Messenger翻译为信使,可以在不同进程中传递Message对象,在Message中放入我们需要传递的信息,然后通过Messenger将Message传递给对方,就可以轻轻松松实现跨进程数据传递。实际上Messenger是一种轻量级的IPC(跨进程通信)方式,它的底层仍然是实现的AIDL。

    此外,还支持记录客户端对象的Messenger,然后可以实现一对多的通信;甚至作为一个转接处,任意两个进程都能通过服务端进行通信。

相同点:

1.都与IPC的调用有关;

2.Messenger 是一种轻量级的 IPC方案,底层实现了AIDL,只是进行了封装,开发的时候不用写.aidl文件。

3.都支持实时通信;

不同点:

1.  Messenger一次只能处理一个请求(串行)/AIDL一次可以处理多个请求(并行);

      当您需要执行 IPC 时,为您的接口使用 Messenger 要比使用 AIDL 实现更加简单,因为  Messenger 会将所有服务调用排入队列,而纯粹的 AIDL 接口会同时向服务发送多个请求,服务随后必须应对多线程处理。

  对于大多数应用,服务不需要执行多线程处理,因此使用 Messenger 可让服务一次处理一个调用。如果您的服务必须执行多线程处理,则应使用 AIDL 来定义接口。

2.  Messenger不支持RPC,只能通过message传递消息/AIDL支持RPC;

3.  Messenger使用简单,轻量级,不需要创建AIDL文件/AIDL使用复杂,需要创建AIDL文件;

服务端:

1.创建一个handler对象,并实现hanlemessage方法,用于接收来自客户端的消息,并作处理

2.创建一个messenger,封装handler

3.用messenger的getBinder()方法获取一个IBinder对象,通过onBind返回给客户端

客户端:

1.在activity中绑定服务

2.创建ServiceConnection并在其中使用 IBinder 将 Messenger实例化 

3.使用Messenger向服务端发送消息,或需要服务器端返回消息,需要创建一个messenger,封装handler,并将这个messenger传递给服务器端。在handler中接收服务器消息。这样就实现了客户端和服务端的双向通信了。

4.解绑服务

5.服务端中在 handleMessage() 方法中接收每个 Message

创建一个service

注册service,当然要设置在不同的进程

注意:Service在声明时必须对外开放,即android:exported="true"

客户端是通过绑定服务端返回的binder来创建Messenger对象,并通过这个Messenger对象来向服务端发送消息。

总结

    Message中的Bundle支持多种数据类型,replyTo字段用于传输Messager对象,以便进程间相互通信

    Messager以串行的方式处理客户端发来的消息,不适合有大量并发的请求

    Messager方法只能传递消息,不能跨进程调用方法
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Storm代理
2023-08-29 广告
"StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,I... 点击进入详情页
本回答由Storm代理提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式