ActivityThread的handleServiceArgs方法用于处理ServiceArgs请求,代码如下:
//frameworks/base/core/java/android/app/ActivityThread.java
public final class ActivityThread extends ClientTransactionHandler implements ActivityThreadInternal {
private void handleServiceArgs(ServiceArgsData data) {
CreateServiceData createData = mServicesData.get(data.token);
Service s = mServices.get(data.token);
if (s != null) {
try {
if (data.args != null) {
data.args.setExtrasClassLoader(s.getClassLoader());
data.args.prepareToEnterProcess(isProtectedComponent(createData.info),
s.getAttributionSource());
}
int res;
if (!data.taskRemoved) {
res = s.onStartCommand(data.args, data.flags, data.startId);
} else {
s.onTaskRemoved(data.args);
res = Service.START_TASK_REMOVED_COMPLETE;
}
QueuedWork.waitToFinish();
try {
ActivityManager.getService().serviceDoneExecuting(
data.token, SERVICE_DONE_EXECUTING_START, data.startId, res);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
} catch (Exception e) {
if (!mInstrumentation.onException(s, e)) {
throw new RuntimeException(
"Unable to start service " + s
+ " with " + data.args + ": " + e.toString(), e);
}
}
}
}
}
上面方法主要处理如下:
1、调用Service的onStartCommand方法。
2、调用Service的onTaskRemoved方法。
下面分别进行分析:
Service onStartCommand
调用Service的onStartCommand方法:
void onStartCommand(Intent intent, int flags, int startId):每次客户端通过调用 startService(Intent)显式启动服务时,由系统调用,提供它提供的参数和表示启动请求的唯一整数标记。
Service onTaskRemoved
调用Service的onTaskRemoved方法:
void onTaskRemoved(Intent rootIntent):如果服务当前正在运行并且用户已经删除了来自服务应用程序的任务,则会调用该服务。