Context的startService用于启动服务,代码如下:
//frameworks/base/core/java/android/content/Context.java
public abstract class Context {
@Nullable
public abstract ComponentName startService(Intent service);
}
Context是抽象类,由其子类ContextImpl实现:
//frameworks/base/core/java/android/content/ContextImpl.java
class ContextImpl extends Context {
@Override
public ComponentName startService(Intent service) {
warnIfCallingFromSystemProcess();
return startServiceCommon(service, false, mUser);
}
}
调用startServiceCommon方法:
//frameworks/base/core/java/android/content/ContextImpl.java
class ContextImpl extends Context {
final @NonNull ActivityThread mMainThread;
private ComponentName startServiceCommon(Intent service, boolean requireForeground,
UserHandle user) {
try {
validateServiceIntent(service); //验证 ServiceIntent
service.prepareToLeaveProcess(this); //对Intent的属性进行离开应用进程前的准备工作
ComponentName cn = ActivityManager.getService().startService(
mMainThread.getApplicationThread(), service,
service.resolveTypeIfNeeded(getContentResolver()), requireForeground,
getOpPackageName(), getAttributionTag(), user.getIdentifier());
if (cn != null) {
if (cn.getPackageName().equals("!")) {
throw new SecurityException(
"Not allowed to start service " + service
+ " without permission " + cn.getClassName());
} else if (cn.getPackageName().equals("!!")) {
throw new SecurityException(
"Unable to start service " + service
+ ": " + cn.getClassName());
} else if (cn.getPackageName().equals("?")) {
throw ServiceStartNotAllowedException.newInstance(requireForeground,
"Not allowed to start service " + service + ": " + cn.getClassName());
}
}
// If we started a foreground service in the same package, remember the stack trace.
// 如果我们在同一个包中启动前台服务,记住堆栈trace
if (cn != null && requireForeground) {
if (cn.getPackageName().equals(getOpPackageName())) {
Service.setStartForegroundServiceStackTrace(cn.getClassName(),
new StackTrace("Last startServiceCommon() call for this service was "
+ "made here"));
}
}
return cn;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
}
调用ActivityManager的getService获取IActivityManager接口,然后调用IActivityManager的startService方法,ActivityManager的getService方法如下:
public class ActivityManager {
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
}
ActivityManagerService startService
调用IActivityManager的startService方法,IActivityManager是一个接口由ActivityManagerService实现,调用ActivityManagerService的startService方法: