Binder机制(待深入)
2015-06-08 10:34:50 5 举报
AI智能生成
登录查看完整内容
为你推荐
查看更多
学习笔记
作者其他创作
大纲/内容
Binder机制
为什么Activity进程通信使用Binder机制
槽: Android的首席架构师之一 是OpenBuilder的开发者
从性能方面来讲,Binder使用了Linux的字符驱动,利用改善的共享内存的机制,适合内存捉襟见肘的移动平台移动平台
而Linux本身的共享内存不太适合移动平台,而其他的进程间通信机制信号量、管道等由于不能满足上层的需求
Android需要一种既能在Native层和Framework层都能通用的进程间通信机制
相关问题
Linux系统进程间通信
1.socket;
2.name pipe命名管道
3.message queue消息队列;
4.singal信号量;
5.share memory共享内存
Java系统的通信方式
1.socket;
2.name pipe
Android系统通信方式
Binder
特点: 是同步,而不是异步
Binder通信实现
1.Binder通信是通过linux的binder driver来实现的
2.Binder通信操作类似线程迁移(thread migration),两个进程间IPC看起来就象是一个进程进入另一个进程执行代码然后带着执行的结果返回;
3.Binder的用户空间为每一个进程维护着一个可用的线程池,线程池用于处理到来的IPC以及执行进程本地消息,Binder通信是同步而不是异步。
Binder实现进程通信原理
1. Android中的Binder通信是基于Service与Client的工作模型的;
2. 所有需要IBinder通信的进程都必须创建一个IBinder接口;
3. 系统中有一个进程管理所有的system service:
4. Android不允许用户添加非授权的System service;
7. 所有的Activity也是通过这个service来启动,加载的;
8. ActivityManagerService也是加载在Systems Servcie中的;
Binder数据传递机制
匿名共享内存子系统Ashmem(Anonymous Shared Memory),减少数据的拷贝次数,读取client或者server端,只需要得到数据所存储的那个文件的描述符
Service工作流程
1.Android虚拟机启动之前系统会先启动service Manager进程;
2.service Manager打开binder驱动,并通知binder kernel驱动程序这个进程将作为System Service Manager;
3.然后该进程将进入一个循环,等待处理来自其他进程的数据。
4.用户创建一个System service后,通过defaultServiceManager得到一个远程ServiceManager的接口,通过这个接口我们可以调用addService函数将System service添加到Service Manager进程中;
5.然后client可以通过getService获取到需要连接的目的Service的IBinder对象,这个IBinder是Service的BBinder在binder kernel的一个参考,
6.所以service IBinder 在binder kernel中不会存在相同的两个IBinder对象,每一个Client进程同样需要打开Binder驱动程序。对用户程序而言,我们获得这个对象就可以通过binder kernel访问service对象中的方法。
7.Client与Service在不同的进程中,通过这种方式实现了类似线程间的迁移的通信方式,对用户程序而言当调用Service返回的IBinder接口后,访问Service中的方法就如同调用自己的函数
ADIL
定义.adil文件,编译器gen目录自动生成.java
定义
定义IPeron接口
interface IPerson { String greet(String someone); }
.java IPerson接口中的抽象内部类Stub继承android.os.Binder类并实现IPerson接口
asInterface(IBinder)方法会将IBinder类型的对象转换成IPerson类型,必要的时候生成一个代理对象返回结果
使用
AIDLService接受服务
onBind()返回一个实现了Iperson接口的IPerson.Stub
IPerson.Stub stub = new IPerson.Stub() { @Override public String greet(String someone) throws RemoteException { return \
注册service
创建ServiceConnection对象通过stub对象使用相关接口
bindService,实例化Person对象
Intent intent = new Intent(\"android.intent.action.AIDLService\
调用person相关方法
person.greet(\"scott\");
unBindService()
unbindService(conn);
0 条评论
回复 删除
下一页