IPC进程间通信 - AIDL+Binder

 
原理
 
服务端,客户端处在用户空间,而binder驱动处在内核空间
  • 服务器端一个Binder服务器端就是一个Binder类的对象当创建一个服务端Binder对象后,服务端内部就会开启一个线程,这个线程用于接收内核空间中的binder驱动发送的信息,收到消息后,会执行相关的服务代码。
  • Binder驱动当服务端成功创建一个Binder对象后,内核空间中的Binder驱动也会相应创建一个mRemote对象(mRemote成员变量实际上是一个BinderProxy对象),该对象的类型也是Binder类。客户就可以借助这个mRemote对象来访问远程服务
  • 客户端客户端要想访问服务端Binder的远程服务,就必须获取服务端远程服务的Binder对象在binder驱动层对应的mRemote引用。当获取到mRemote对象的引用后,就可以通过此引用调用相应Binder对象的服务了。
  • serviceManger它本身也是一个service,但它管理着系统其它的service。Framework提供了一个系统函数BinderInternal.getContextObject(),可以获取该Service对应的Binder引用。通过这个静态函数返回的ServiceManager提供的方法又可以获取其它系统Service的Binder引用。所以serviceManager是整个系统service的总管,也是系统的一个核心对象,它是开机就自启动的。其它的service都要向它进行注册并保管引用,这样保证所有的服务都可以通过servericeManger获取到引用。这种设计模式的一个好处就是仅暴露一个Binder引用,而其它的系统服务可以隐藏起来,从而有助于系统服务的扩展,以及调用系统服务的安全检查 。
---------------------------------------------------------------------------------------------
          在Android系统的Binder机制中,由一系统组件组成,分别是Client、Server、Service Manager和Binder驱动程序,其中Client、Server和Service Manager运行在用户空间,Binder驱动程序运行内核空间。
          Binder就是一种把这四个组件粘合在一起的粘结剂,核心组件便是Binder驱动程序;Service Manager提供了辅助管理的功能,Client和Server正是在Binder驱动和Service Manager提供的基础设施上,进行Client-Server之间的通信。
  • 1. Client、Server和Service Manager实现在用户空间中,Binder驱动程序实现在内核空间中
  • 2. Binder驱动程序和Service Manager在Android平台中已经实现,开发者只需要在用户空间实现自己的Client和Server
 
  • 3. Binder驱动程序提供设备文件/dev/binder与用户空间交互,Client、Server和Service Manager通过open和ioctl文件操作函数与Binder驱动程序进行通信
  • 4. Client和Server之间的进程间通信通过Binder驱动程序间接实现
  • 5. Service Manager是一个守护进程,用来管理Server,并向Client提供查询Server接口的能力
 
 

AIDL使用方法
 
《疯狂android讲义3》
 
IPC调用会挂起应用程序导致界面失去响应. 这种情况应该考虑单起一个线程来处理。IPC的调用步骤:
1. 声明一个接口类型的变量,该接口类型在.aidl文件中定义。
2. 实现ServiceConnection。
3. 调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递.
4. 在ServiceConnection.onServiceConnected()实现中,你会接收一个IBinder实例(被调用的Service). 调用    YourInterfaceName.Stub.asInterface((IBinder)service)将参数转换YourInterface类 型。
5. 调用接口中定义的方法。 你总要检测到DeadObjectException异常,该异常在连接断开时被抛出。它只会被远程方法抛出。
6. 断开连接,调用接口实例中的ApplicationContext.unbindService()
 
 
 
 
 
 



转载于:https://www.cnblogs.com/Doing-what-I-love/p/5533011.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值