bindService流程
ContextImpl
1、bindService
@Override
public boolean bindService(Intent service, ServiceConnection conn, int flags) {
warnIfCallingFromSystemProcess();
return bindServiceCommon(service, conn, flags, null, mMainThread.getHandler(), null,
getUser());
}
2、bindServiceCommon
可以看到
bind
流程很像广播的注册流程,都是需要传入一个dispatcher
(同时也很像Handler
,因为Handler
也是将自己传给Message
,所以感觉很多源码的设计思想都是大同小异的)。
mPackageInfo
是一个LoadedApk
对象,通过getServiceDispatcher
去创建一个ServiceDispatcher
。
和广播一样,IServiceConnection
是InnerConnection
的实现类,InnerConnection
是ServiceDispatcher
的内部类,ServiceDispatcher
持有ServiceConnection
、Context
、Handler
等对象,而InnerConnection
这个Binder
对象持有一个ServiceDispatcher
的弱引用对象,也就是我们要传入给AMS
的参数sd
里面是持有了ServiceDispatcher
内所有信息的。所以才能实现在连接完成之后回调到对应的onConnected
@Override
private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags,
String instanceName, Handler handler, Executor executor, UserHandle user) {
IServiceConnection sd;
...
if (mPackageInfo != null) {
if (executor != null) {
sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), executor, flags);
} else {
sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), handler, flags);
}
}
//不允许隐式绑定
validateServiceIntent(service);
try {
IBinder token = getActivityToken();
if (token == null && (flags&BIND_AUTO_CREATE) == 0 && mPackageInfo != null
&& mPackageInfo.getApplicationInfo().targetSdkVersion
< android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
flags |= BIND_WAIVE_PRIORITY;
}
service.prepareToLeaveProcess(this);
//调用AMS方法bindIsolatedService
int res = ActivityManager.getService().bindIsolatedService(
mMainThread.getApplicationThread(), getActivityToken(), service,
service.resolveTypeIfNeeded(getContentResolver()),
sd, flags, instanceName, getOpPackageName(), user.getIdentifier());
...
return res != 0;
}
}
AMS
1、bindIsolatedService
将逻辑交给
ActiveService
处理
public int bindIsolatedService(...) {
enforceNotIsolatedCaller("bindService");
synchronized(this) {
//调用ActiveService的方法
return mServices.bindServiceLocked(...);
}
}
ActiveService
1、bindServiceLocked(重要)
这个方法比较重要,所以分成几块说明:
第一部分:
主要是初始化了一些变量,例如:
ProcessRecord
、ServiceRecord
、AppBindRecord
以及ConnectionRecord
,然后调用bringUpServiceLocked
- 1、
ServiceRecord
:保存这个服务所有信息的记录。每一个应用程序进程绑定了一个Service
组件之后,用来描述这个应用程序进程的一个PorcessRecord
对象就会被保存在用来描述这个被绑定的Service
组件的一个ServiceRecord
对象的成员变量bingdings
中。由于一个Service
组件可能会被多个应用程序进程绑定,因此,用来描述这个Service
组件的一个ServiceRecord
对象就会使用一个IntentBindRecord
对象来描述这些应用程序进程,并且以一个FilterComparison
对象作为关键字保存在该ServiceRecord
对象的成员变量bindings
中- 2、
AppBindReco