1, startService
启动一个服务至少需要在2个进程之间进行跨进程通信,
1,进程A向AMS发送一个请求
2,AMS处理之后,到进程A所启动的服务所在的进程。
1,应用进程
客户端apk调用startService方法调用流程图如下,
Context的startService方法如下,
public ComponentName startService(Intent service) {
warnIfCallingFromSystemProcess();
return startServiceCommon(service, mUser);
}
startServiceCommon方法如下,
private ComponentName startServiceCommon(Intent service, UserHandle user) {
try {
validateServiceIntent(service);
service.prepareToLeaveProcess();
ComponentName cn = ActivityManagerNative.getDefault().startService(
mMainThread.getApplicationThread(), service, service.resolveTypeIfNeeded(
getContentResolver()), getOpPackageName(), user.getIdentifier());
if (cn != null) {
•••
}
return cn;
} catch (RemoteException e) {
throw new RuntimeException("Failure from system", e);
}
}
不用说,直接利用binder机制,跨进程调用AMS的startservice方法
2 AMS进程
在AMS服务所在的进程调用流程图如下,
AMS的startService方法如下,
public ComponentName startService(IApplicationThread caller, Intent service,
String resolvedType, String callingPackage, int userId)
throws TransactionTooLargeException {
enforceNotIsolatedCaller("startService");
•••
synchronized(this) {
final int callingPid = Binder.getCallingPid();