9.2.1 app.kill
[-> ProcessRecord.java]
void kill(String reason, boolean noisy) {
if (!killedByAm) {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "kill");
if (noisy) {
Slog.i(TAG, "Killing " + toShortString() + " (adj " + setAdj + "): " + reason);
}
EventLog.writeEvent(EventLogTags.AM_KILL, userId, pid, processName, setAdj, reason);
Process.killProcessQuiet(pid); //杀进程
Process.killProcessGroup(info.uid, pid); //杀进程组,包括native进程
if (!persistent) {
killed = true;
killedByAm = true;
}
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
}
}
此处reason为“crash”,关于杀进程的过程见我的另一篇文章 理解杀进程的实现原理.
9.2.2 handleAppDiedLocked
[-> ActivityManagerService.java]
private final void handleAppDiedLocked(ProcessRecordapp,
boolean restarting, boolean allowRestart) {
int pid = app.pid;
//清除应用中service/receiver/ContentProvider信息
boolean kept = cleanUpApplicationRecordLocked(app, restarting, allowRestart, -1);
if (!kept && !restarting) {
removeLruProcessLocked(app);
if (pid > 0) {
ProcessList.remove(pid);
}
}
if (mProfileProc == app) {
clearProfilerLocked();
}
//清除应用中activity相关信息
boolean hasVisibleActivities = mStackSupervisor.handleAppDiedLocked(app);
app.activities.clear();
...
if (!restarting && hasVisibleActivities && !mStackSupervisor.resumeTopActivitiesLocked()) {
mStackSupervisor.ensureActivitiesVisibleLocked(null, 0);
}
}
9.3 ASS.resumeTopActivitiesLocked
[-> ActivityStackSupervisor.java]
boolean resumeTopActivitiesLocked() {
return resumeTopActivitiesLocked(null, null, null);
}
boolean resumeTopActivitiesLocked(ActivityStacktargetStack, ActivityRecordtarget,
BundletargetOptions) {
if (targetStack == null) {
targetStack = mFocusedStack;
}
boolean result = false;
if (isFrontStack(targetStack)) {
//【见小节9.3.1】
result = targetStack.resumeTopActivityLocked(target, targetOptions);
}
for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
final ArrayList stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
final ActivityStackstack = stacks.get(stackNdx);
if (stack == targetStack) {
continue; //已经启动
}
if (isFrontStack(stack)) {
stack.resumeTopActivityLocked(null);
}
}
}
return result;
}
此处 mFocusedStack 是当前正在等待接收input事件或者正在启动下一个activity的 ActivityStack 。
9.3.1 AS.resumeTopActivityLocked
[-> ActivityStack.java]
final boolean .resumeTopActivityLocked(ActivityRecordprev, Bundleoptions) {
...
result = resumeTopActivityInnerLocked(prev, options);//【见小节9.3.2】
return result;
}
9.3.2 AS.resumeTopActivityInnerLocked
[-> ActivityStack.java]
private boolean resumeTopActivityInnerLocked(ActivityRecordprev, Bundleoptions) {
//找到mTaskHistory栈中第一个未处于finishing状态的Activity
final ActivityRecordnext = topRunningActivityLocked(null);
if (mResumedActivity == next && next.state == ActivityState.RESUMED &&
mStackSupervisor.allResumedActivitiesComplete()) {
//当top activity已经处于resume,则无需操作;
return false;
}
if (mService.isSleepingOrShuttingDown()
&& mLastPausedActivity == next
&& mStackSupervisor.allPausedActivitiesComplete()) {
//当正处于sleeping状态,top activity处于paused,则无需操作
return false;
}
//正在启动app的activity,确保app不会被设置为stopped
AppGlobals.getPackageManager().setPackageStoppedState(
next.packageName, false, next.use