Binder与Service 通信机制详解二 (Binder与Service理解)

          本节主要是解释一个个要点,循序渐进,最后会结合代码,把各个要点呈现到代码中给大家理解,所以大家务必理解这些知识点。

          了解Binder与Service 通信机制之前我们需要先了解什么是Binder,什么是Service?

       什么是Service?

          Service顾名思义,就是系统提供给我们的没有用户界面,可以在后台默默的为我们服务的一个东西。当一个服务运行起来在后台为我们服务的时候,我们作为客户端少不了需要与Service端进行通信。当然如果你是以startService方式启动Service的话,你可以通过广播的机制在客户端与服务端进行通信。如果你通过广播的方式这有个限制就是你的客户端和服务端需要在同一个进程当中,也就是在同一个app当中进行。但是很多时候,app A 需要访问app B里面的服务。也就是说A是客户端,B是服务端,这也是我们常说的IPC进程间通信。这两个app不在同一个进程当中运行,所以自然也不能简单的通过上面提到的发送广播的方式进行通信了。那么怎么办呢?当然,肯定是有解决办法的,这个时候Binder就应运而生。下面提到的Service和服务是同一个意思。

          什么是Binder?

          首先明白Binder的出现是用来解决进程间通信(IPC)的。Binder它工作在linux层面,属于一个驱动,一般来说驱动都基于硬件的,但是Binder不需要硬件,而是基于一小段内存。从线程的角度来讲,Binder驱动运行在内核态,客户端调用Binder是通过系统调用来完成的。

          Binder架构

          Binder架构是由三部分组成,服务端,Binder驱动,客户端接口三个模块组成。那么我们先大致解释下这三个模块。

          服务端:在你创建一个Service的时候,若你的Service需要完成进程间通信,那么你需要在Service端创建一个Binder类对象,该对象一旦创建,内部就会启动一个隐藏线程。该线程接下来会接收Binder驱动发送的消息,收到消息后会执行到Binder对象中的onTransact函数,并按照函数的参数执行不同的服务代码。因此要实现这个Binder服务端,就必须要重载onTransact这个方法。那么我们怎么去重载这个方法呢?其实android为我们提供了解决方案那就是通过AIDL方式,我们在工程里创建一个aidl文件,那么会在gen目录下生成对应的.java文件,在该文件中就重载了这个方法,当服务端收到消息时就会进入该方法。至于这一块是如何在工作的,后面的章节我会给大家详细讲解的。

          Binder驱动:在服务端Binder对象创建的时候,同时会在Binder驱动中创建一个也为Binder类类型的mRemote对象,这个对象是给客户端调用,用来与远程服务端进行通信用的。在Binder驱动中mRemote对象也重载了transact()方法,其主要要做的工作有以下几点:

          1:以线程间消息通信的模式,向服务端发送客户端传递过来的参数。

          2:挂起当前线程,当前线程正是客户端线程,并等待服务端线程执行完指定服务函数后通知

          3:接收到服务端线程的通知,然后继续执行客户端线程,并返回到客户端代码区。

其对应的代码同样在aidl生成的对应的.Java文件里面,现在不理解这三点没关系,后面章节会详细讲解的。到时你回过头来看自然就明白了。

          客户端:客户端想要访问远程服务,那么是需要通过Binder对象去访问过去的。上面提到过服务端生成了一个Binder对象,Binder驱动中也创建了一个Binder对象。如果客户端和服务在同一个进程,那么获取到的是服务端创建的那个Binder对象,如果客户端和服务在不同的进程,则客户端获取到的是Binder驱动中的那个Binder对象mRemote。然后再通过mRemote这个对象进行中转,达到与服务通信的目的。

          好了,有了上述的知识,我们可以自己设计服务端和客户端了,那么我将在下一篇文章中进行讲解。

Binder与Service 通信机制详解一 (前言)

Binder与Service 通信机制详解二 (Binder与Service理解)

Binder与Service 通信机制详解三 (服务端和客户端设计)

Binder与Service 通信机制详解四 (源码分析AIDL工作机制)




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值