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

本文详细剖析了Android中bindService的整个流程,从bindService开始,经过bindServiceCommon、bindServiceLocked,到bringUpServiceLocked、realStartServiceLocked、requestServiceBindingLocked,再到handleBindService、publishService和connected。在连接完成后,doConnected方法被调用,实现服务与客户端的交互。文章总结了bindService的整体流程,并探讨了多线程、回调机制以及旧连接处理等关键点,为理解Android服务绑定提供了深入洞察。
最低0.47元/天 解锁文章

1866

被折叠的 条评论
为什么被折叠?



