Context的bindService用于绑定服务,代码如下:
//frameworks/base/core/java/android/content/Context.java
public abstract class Context {
public abstract boolean bindService(@RequiresPermission Intent service,
@NonNull ServiceConnection conn, @BindServiceFlags int flags);
}
Context是抽象类,由其子类ContextImpl实现,第一个参数传入Intent,第二个参数传入创建的ServiceConnection, ServiceConnection本身是一个接口. 其中包括两个回调方法, bindService()是在ContextWrapper.java类中实现的。第三个参数指示绑定选项的标志,通常应该是 BIND_AUTO_CREATE,以便创建尚未激活的服务。 其他可能的值为 BIND_DEBUG_UNBIND 和 BIND_NOT_FOREGROUND,或 0(表示无)
//frameworks/base/core/java/android/content/ContextImpl.java
class ContextImpl extends Context {
@Override
public boolean bindService(Intent service, ServiceConnection conn, int flags) {
warnIfCallingFromSystemProcess();
return bindServiceCommon(service, conn, flags, null, mMainThread.getHandler(), null,
getUser());
}
}
调用bindServiceCommon方法:
//frameworks/base/core/java/android/content/ContextImpl.java
class ContextImpl extends Context {
final @NonNull LoadedApk mPackageInfo;
private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags,
String instanceName, Handler handler, Executor executor, UserHandle user) {
// Keep this in sync with DevicePolicyManager.bindDeviceAdminServiceAsUser and
// ActivityManagerLocal.bindSdkSandboxService
IServiceConnection sd;
if (conn == null) {
throw new IllegalArgumentException("connection is null");
}
if (handler != null && executor != null) {
throw new IllegalArgumentException("Handler and Executor both supplied");
}
if (mPackageInfo != null) {
if (executor != null) {
sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), executor, flags);
} else {
sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), handler, flags);
}
} else {
throw new RuntimeException("Not supported in system context");
}
validateServiceIntent(service); //验证 ServiceIntent
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); //对Intent的属性进行离开应用进程前的准备工作
int res = ActivityManager.getService().bindServiceInstance(
mMainThread.getApplicationThread(), getActivityToken(), service,
service.resolveTypeIfNeeded(getContentResolver()),
sd, flags, instanceName, getOpPackageName(), user.getIdentifier());
if (res < 0) {
throw new SecurityException(
"Not allowed to bind to service " + service);
}
return res != 0;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
}
调用ActivityManager的getService获取IActivityManager接口,然后调用IActivityManager的bindServiceInstance方法,ActivityManager的getService方法如下:
public class ActivityManager {
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
}
ActivityManagerService bindServiceInstance
调用IActivityManager的bindServiceInstance方法,IActivityManager是一个接口由ActivityManagerService实现,调用ActivityManagerService的bindServiceInstance方法:
Android13 ActivityManagerService bindServiceInstance流程分析-CSDN博客