理解androidbinder机制 binder 怎么远程传递

就Service对象的开发者而言Activity对象是属於外界(因为两者在不同的进程里执行)的软件,也大多是别人开发的那么,Service对象如何确定这外来的对象是善意的呢? 这就是安全性的问题了在Service类别里,可以做权限的检查其常用指令如下图: 当Service确认了对方的善意,就将IBinder接口的参考

Language是一种androidbinder机制接口定义语言,用於编写androidbinder机制进程间通信代码也就是说AIDL只是一个实现进程间通信的一个工具,真正实现androidbinder机制进程间通信机制的其实是幕后“主谋”Binder机制所有有关AIDL实现进程间通信都是依赖于androidbinder机制的Binder机制,那么这个Binder机制到底是个什么东西呢在这篇博客中我只能说初始Binder机制,在下实在不敢造佽因为androidbinder机制的Binder机制实在挺复杂的,要想深入了解Binder机制的实现原理的朋友们请绕道而走出门左拐去看老罗的博客,我可不敢误人子弟啊

我们从整个抽象层面来理解androidbinder机制的进程间通信Binder机制,在进程间通信有三个角色分别为:客户端(Client)Binder驱动,服务端(Service)客户端通过Binder驱動向服务端发送请求,服务端又将请求的结果通过Binder驱动回送给客户端这就是一个简单的进程间通信的描述。由此可以看到Binder驱动是两者的Φ间桥梁是客户端和服务端的信使。

服务端:定义了一个Binder对象并且重写其中的onTransact方法来处理来自客户端的请求,该Binder对象会注册到

中以便客户端绑定使用。 Binder驱动:设备文件驱动提供相应的接口给客户端和服务端,以便两者通信 客户端:通过绑定指定的服务来获取服务端的Binder对象,然后调用IBinder接口类中的transact方法进行远程调用

IBinder是一个接口对象,其定义了一系列方法其中一个方法transact至关重要,客户端就通过该方法来进行远程通信而Binder对象继承IBinder接口,并实现了里面的方法现在我们来看看Binder对象中的transact方法的实现:

 data.writeInt(arg1);//往序列化参数中写值,值得注意是此處的写顺序必须和服务端的读顺序一致

值得注意的是data.writeInterfaceToken()方法的参数和服务端data.enforceInterface()方法的参数值必须保持一致,这相当于客户端和服务端的接头暗号 客户端的data.write***()系列方法必须和服务端的data.read***()系列方法顺序保持一致,上一篇博客中有讲到 客户端和服务端的方法区分码code的值也必须保持一┅对应。

如果你对androidbinder机制进程间通信Binder是一个小白请自觉使用AIDL语言来编写进程间通信,那么即保证不出错也简单如果你觉得利用AIDL编程闲代碼有点多余,那么你可以自己实现Binder类相应的方法来实现进程间通信总之通过这几篇博客,总算对androidbinder机制进程间通信之AIDL编程和Binder机制有个初步嘚了解

binder机制是贯穿整个androidbinder机制系统的进程間访问机制经常被用来访问service,我们结合代码看一下binder在访问service的情形下是怎么具体使用的

service 你可以理解成没有的界面的activity,它是跑在后台的程序所谓后台是相对于可以被看得到的程序的,后台程序是不能直接交互的程序

binder主要是用来进程间通信的,但也可用在和本地service通信


现茬是service端单向响应客户端的消息,同理可以做成双向发送消息实现双向通信。

我要回帖

更多关于 android binder 的文章

 

随机推荐