Android Framework学习记录1:Binder

我在博客上记录下我的Android Framework学习总结,方便以后回忆的时候更有效率。我主要是通过Android内核剖析这本书进行学习,这也是我第一次接触到Framework层。

1.Binder是什么

Android作为一个操作系统,不同的进程之间进行数据交互就是通过Binder来进行交互。Binder的具体工作方式在C层,这里只做基本原理的介绍和使用方法。
Binder是一种框架,一种进程间交互的方式。包括服务端接口、Binder驱动、客户端接口3个模块。
      一个Binder服务端其实就是一个Binder对象,该对象一创建内部就启动一个隐藏线程,用来接收来自Binder驱动的消息,然后通过内部的onTransact方法来执行相应的操作,假如有返回值的话就通过Binder驱动再创给客户端。
      Binder驱动是客户端和服务器端的中间层,只要负责接收客户端的调用,传递到服务端,然后将服务端的结果放回到客户端,Binder驱动创建时也会创建一个Binder对象mRemote,客户端访问服务器端就是通过这个对象。具体步骤如下:
      1.客户端调用驱动,然后驱动讲数据传递给服务器端
       2.挂起当前线程(即客户端线程),等待服务器端调用完毕后notify
       3.接收到服务器的通知,继续执行客户端代码
     客户端 主要是根据需求使用mRemote对象的transact方法来和服务端通信。


   


2.怎么使用Binder

    对于Binder的使用者来说,有两个问题,一是客户端怎么获得mRemote对象,二是客户端调用服务端怎么保证参数及方法的正确性和顺序。
    
     第一个问题,客户端可以通过bindService()方法来和服务端建立连接  ,该方法第二个参数是ServiceConnection对象,
public interface ServiceConnection {
    
    public void onServiceConnected(ComponentName name, IBinder service);

   
    public void onServiceDisconnected(ComponentName name);
}
    在和服务端建立连接成功后就会回调方法onServiceConnected(),具体的调用流程是程序请求AMS连接某个Service,连接成功后会通过AMS远程调用ActivityThread中的Binder对象ApplicationThread,调用的参数就包含这个Service的Binder对象(实际就是Binder驱动的mRemote对象),然后ApplicationThread把连接成功的参数消息传递到ActivityThread,接着就回调方法onServiceConnected(),这样客户端就获得了可以和服务端交互的Binder.

   第二个问题就是如何保存客户端能够正确的调用服务端,即如何保证方法和参数的正确性。对于这个我们可以使用AIDL工具来自动生成代码,从而使我们能更简单的使用Binder,AIDL具体如何使用网上有很多教程,我只对关键部分进行一些介绍。
   1.Stub类,服务端继承该类来实现具体的函数,该类实现了onTransaction方法,用于将客户端传递过来的参数转换为服务端可使用的形式。客户端使用它的静态方法asInterface来生成可直接调用的对象。在asInterface中可以看到,首先会检测服务端和客户端是不是同一个进程,是的话就可以将服务端Binder'直接转换使用,不是的话就必须生成一个Proxy对象来调用。
   2.Proxy类,该类的用于客户端不和服务端在同一进程时,该类提供了客户端可直接调用的接口,在内部封装了将调用信息传给mRemote的具体过程。
   这样,客户端就可以和服务端进行通信,而在客户端看了就像是直接和服务端进行通信,实际用中间的Binder驱动进行了转换。

3.系统怎么使用Binder的

  通常我们想获取一个系统的服务通过getSystemService("Service")方法来获得,其实其内部也是通过Binder机制完成的。
  以InputMethodManager为例,在内部就有一个IInputMethodManager对象,我们队InputMethodManager的使用实际上大都是通过IInputMethodManager完成的,他就是通过系统服务端的InputMethodxiangg
         


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值