Android进程间通信Binder机制
2016-03-10 20:38
246 查看
以下皆为个人理解,如有不妥之处请谅解。
首先是一些基础知识,IBinder 是一个接口 , Binder 是实现 IBinder的一个类;
写一个Binder类可以通过AIBL 或者自己手动,这里以AIDL为例 ;
以下是经过AIDL得到的Binder类代码结构(只写出重点部分,并不完整):
下面是Binder的执行流程:
服务端定义了Binder,而客户端的Binder一般由服务端Service的onBind()返回,那么两端都能调用执行Binder中的方法了;
首先在客户端中的一个线程调用了Stub中Proxy的clientMethod();
clientMethod()中创建了用于包装数据的Parcel对象,然后clientmethod还调用了一个transact()方法,在这个transact()中发起了远程调用请求
(此时客户端线程挂起), 这个远程调用请求使得服务端的一个线程调用服务端的Binder中的onTransact(),onTransact()中将clientmethod创建
并传过来的Parcel对象进行处理,唤醒客户端线程,将parcel对象传回去给客户端线程,完成进程间的通信。
首先是一些基础知识,IBinder 是一个接口 , Binder 是实现 IBinder的一个类;
写一个Binder类可以通过AIBL 或者自己手动,这里以AIDL为例 ;
以下是经过AIDL得到的Binder类代码结构(只写出重点部分,并不完整):
</pre><pre name="code" class="java">public interface infa extends android.os.IInterface { public static abstract class Stub extends android.os.Binder implements infa { public boolean onTransact(....) {...} private static class Proxy implements infa { private android.os.IBinder mRemote; clientMethod{ ... ; mRemote.transact(); ... }; } } }
下面是Binder的执行流程:
服务端定义了Binder,而客户端的Binder一般由服务端Service的onBind()返回,那么两端都能调用执行Binder中的方法了;
首先在客户端中的一个线程调用了Stub中Proxy的clientMethod();
clientMethod()中创建了用于包装数据的Parcel对象,然后clientmethod还调用了一个transact()方法,在这个transact()中发起了远程调用请求
(此时客户端线程挂起), 这个远程调用请求使得服务端的一个线程调用服务端的Binder中的onTransact(),onTransact()中将clientmethod创建
并传过来的Parcel对象进行处理,唤醒客户端线程,将parcel对象传回去给客户端线程,完成进程间的通信。
相关文章推荐
- 带导航点的ViewPager
- Android 开发百度地图之三GEO
- Java以及Android回调机制的一些理解
- Android实现控件动画效果
- Android音频开发(2):如何采集一帧音频
- Android——ListView的setSelection()和setSelectionFromTop()联系
- 浅学android 动画
- Android 全景框架了解
- Android返回数据给上一个活动-startActivityForResult
- android开发之java内存泄露分析
- android源码设计模式解析与实战 读书笔记 2 单例模式(上)
- android开发系列之代码整洁之道
- android随笔:计量单位之dp,sp,px
- Android之Button
- 【android】ListView 的 stackFromBottom 选项
- Android签名机制之---签名验证过程详解
- android基础开发之RecycleView(1)---基本使用方式
- Android能发音的生词本
- Android开发小知识-Spinner控件使用
- Android监听事件四种方法