最近学习IBinder机制,看到Framework里面很多╳╳╳Service都是通过ServiceManager来获取的,实际上底层就是采用Binder机制来得到的。为了更清楚的了解Android系统Binder机制中的四个组件,可以用下面的图来表示
以bindService为例,Application1中的某个Activity通过bindService(intent)来试图启动符合intent描述的Service服务。
(1)、应用程序填写Intent,调用bindService发出请求。
(2)、收到请求的bindService将与ActivityManagerService取得联系,为了获得AMS的Binder句柄值,还要事先调用ServiceManager.getService。
(3)、AMS基于特定的“最优匹配策略”,从其内部存储的系统所有服务组件的资料中找到与Intent最匹配的一个,然后向它发送Service绑定请求,如果目标进程不存在的话,AMS还要负责把它启动起来。
(4)、“被绑定”的服务进程需要响应绑定,执行具体操作,并在成功完成后通知AMS,然后由后者再回调发起请求的应用程序。
@Override
public boolean bindService(Intent service,ServiceConnection conn,
intflags) {
//mBase就是ContextImpl
returnmBase.bindService(service, conn, flags);
}
ContextImpl类中调用bindService启动服务,bindService直接调用bindServiceCommon。
private boolean bindServiceCommon(Intent service,ServiceConnection conn, int flags,UserHandle user) {
...
try {
...
int res =ActivityManagerNative.getDefault().bindService(
mMainThread.getApplicationThread(),getActivityToken(), service,
service.resolveTypeIfNeeded(getContentResolver()),
sd,flags, getOpPackageName(), user.getIdentifier());
...
}
AMS同样提供了ActivityManagerNative和ActivityManagerProxy,具体如下:
static public IActivityManager getDefault() {
//得到默认的IActivityManager对象
return gDefault.get();
}
这个gDefault.get()得到的是什么?当调用gDefault.get()时,会先进行内部判断,如果该对象已经存在,就直接返回它的现有值;否则才需要通过内部create()新建一个对象实例。
private static final SingletongDefault = new Singleton() {
protected IActivityManagercreate() {
//通过ServiceManager取得ActivityManagerService的IBinder对象
IBinder b =ServiceManager.getService("activity");
if (false) {
Log.v("ActivityManager","default service binder = " + b);
}
//创建一个可用的ActivityManagerProxy
IActivityManager am =asInterface(b);
if (false) {
Log.v("ActivityManager","default service = " + am);
}
return am;
}
};
ActivityManagerNative的作用之一,就是帮助调用者方便快速地取得一个ActivityManagerProxy,另一个作用就是为ActivityManagerService的实现提供便利,它既是面向调用者的,也是面向服务实现本身的。