最近遇到一个问题,kill掉前台app会返回桌面,为什么不是上一个app呢?
我遇到的杀掉前台进程是有两种方式,一种是系统调用AMS.forceStopPackage; 另一种是app自己调用System.exit(0).
通过打印AMS调用栈能直观看出(基于代码Android O),
1. AMS.forceStopPackage,
04-20 18:34:59.625 3561 3888 D ActivityManager: setFocusStackUnchecked, focusCandidate:ActivityStack{b020eca stackId=0 type=home mode=fullscreen visible=true translucent=true, 1 tasks}
04-20 18:34:59.625 3561 3888 D ActivityManager: java.lang.RuntimeException
04-20 18:34:59.625 3561 3888 D ActivityManager: at com.android.server.am.ActivityStackSupervisor.setFocusStackUnchecked(ActivityStackSupervisor.java:718)
04-20 18:34:59.625 3561 3888 D ActivityManager: at com.android.server.am.ActivityStack.moveToFront(ActivityStack.java:1057)
04-20 18:34:59.625 3561 3888 D ActivityManager: at com.android.server.am.ActivityStack.moveToFront(ActivityStack.java:1019)
04-20 18:34:59.625 3561 3888 D ActivityManager: at com.android.server.am.ActivityStackSupervisor.moveHomeStackToFront(ActivityStackSupervisor.java:744)
04-20 18:34:59.625 3561 3888 D ActivityManager: at com.android.server.am.ActivityStack.removeTask(ActivityStack.java:5166)
04-20 18:34:59.625 3561 3888 D ActivityManager: at com.android.server.am.ActivityStack.removeActivityFromHistoryLocked(ActivityStack.java:4168)
04-20 18:34:59.625 3561 3888 D ActivityManager: at com.android.server.am.ActivityStack.removeHistoryRecordsForAppLocked(ActivityStack.java:4528)
04-20 18:34:59.625 3561 3888 D ActivityManager: at com.android.server.am.ActivityStack.handleAppDiedLocked(ActivityStack.java:5018)
04-20 18:34:59.625 3561 3888 D ActivityManager: at com.android.server.am.ActivityStackSupervisor.handleAppDiedLocked(ActivityStackSupervisor.java:2155)
04-20 18:34:59.625 3561 3888 D ActivityManager: at com.android.server.am.ActivityManagerService.handleAppDiedLocked(ActivityManagerService.java:5903)
04-20 18:34:59.625 3561 3888 D ActivityManager: at com.android.server.am.ActivityManagerService.removeProcessLocked(ActivityManagerService.java:7498)
04-20 18:34:59.625 3561 3888 D ActivityManager: at com.android.server.am.ActivityManagerService.killPackageProcessesLocked(ActivityManagerService.java:7139)
04-20 18:34:59.625 3561 3888 D ActivityManager: at com.android.server.am.ActivityManagerService.forceStopPackageLocked(ActivityManagerService.java:7272)
04-20 18:34:59.625 3561 3888 D ActivityManager: at com.android.server.am.ActivityManagerService.forceStopPackageLocked(ActivityManagerService.java:7051)
04-20 18:34:59.625 3561 3888 D ActivityManager: at com.android.server.am.ActivityManagerService.forceStopPackage(ActivityManagerService.java:6851)
同时贴下resume的调用栈
04-20 18:34:59.629 3561 3888 D ActivityManager: resumeTopActivityInnerLocked->next ActivityRecode:ActivityRecord{f16f467 u0 com.xxx.home/.MainActivity t1}
04-20 18:34:59.629 3561 3888 D ActivityManager: java.lang.RuntimeException
04-20 18:34:59.629 3561 3888 D ActivityManager: at com.android.server.am.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:2349)
04-20 18:34:59.629 3561 3888 D ActivityManager: at com.android.server.am.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2300)
04-20 18:34:59.629 3561 3888 D ActivityManager: at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:2259)
04-20 18:34:59.629 3561 3888 D ActivityManager: at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:2240)
04-20 18:34:59.629 3561 3888 D ActivityManager: at com.android.server.am.ActivityManagerService.handleAppDiedLocked(ActivityManagerService.java:5920)
04-20 18:34:59.629 3561 3888 D ActivityManager: at com.android.server.am.ActivityManagerService.removeProcessLocked(ActivityManagerService.java:7498)
04-20 18:34:59.629 3561 3888 D ActivityManager: at com.android.server.am.ActivityManagerService.killPackageProcessesLocked(ActivityManagerService.java:7139)
04-20 18:34:59.629 3561 3888 D ActivityManager: at com.android.server.am.ActivityManagerService.forceStopPackageLocked(ActivityManagerService.java:7272)
04-20 18:34:59.629 3561 3888 D ActivityManager: at com.android.server.am.ActivityManagerService.forceStopPackageLocked(ActivityManagerService.java:7051)
04-20 18:34:59.629 3561 3888 D ActivityManager: at com.android.server.am.ActivityManagerService.forceStopPackage(ActivityManagerService.java:6851)
从上面两个调用栈可以看到AMS的处理逻辑,前台app进程被杀后,会触发AMS.handleAppDieLocked, 这里首先会把被杀掉app的activityRecord和activityRecord所在的taskRecord信息从系统中移除调,移除完后moveHomeStackToFront , 具体实现就是调用setFocusStackUnchecked 把stackId = 0的stack即homestack,赋给ActivityStackSurpervior.mFocusedStack.
然后从handleAppDieLocked出发,调用的resumeFocusedStackTopActivityLocked,就会去调用mFocusedStack
boolean resumeFocusedStackTopActivityLocked(
ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
if (!readyToResume()) {
return false;
}
if (targetStack != null && isFocusedStack(targetStack)) {
return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
}
//mFocusedStack已经是homeStack,stackId=0,
final ActivityRecord r = mFocusedStack.topRunningActivityLocked();
//此时r.state是STOPPED,非RESUMED
if (r == null || !r.isState(RESUMED)) {
mFocusedStack.resumeTopActivityUncheckedLocked(null, null);
} else if (r.isState(RESUMED)) {
// Kick off any lingering app transitions form the MoveTaskToFront operation.
mFocusedStack.executeAppTransition(targetOptions);
}
return false;
}
2. System.exit触发的AMS的调用栈
04-20 18:47:36.246 3561 3871 D ActivityManager: setFocusStackUnchecked, focusCandidate:ActivityStack{b020eca stackId=0 type=home mode=fullscreen visible=true translucent=true, 1 tasks}
04-20 18:47:36.246 3561 3871 D ActivityManager: java.lang.RuntimeException
04-20 18:47:36.246 3561 3871 D ActivityManager: at com.android.server.am.ActivityStackSupervisor.setFocusStackUnchecked(ActivityStackSupervisor.java:718)
04-20 18:47:36.246 3561 3871 D ActivityManager: at com.android.server.am.ActivityStack.moveToFront(ActivityStack.java:1057)
04-20 18:47:36.246 3561 3871 D ActivityManager: at com.android.server.am.ActivityStack.moveToFront(ActivityStack.java:1019)
04-20 18:47:36.246 3561 3871 D ActivityManager: at com.android.server.am.ActivityStackSupervisor.moveHomeStackToFront(ActivityStackSupervisor.java:744)
04-20 18:47:36.246 3561 3871 D ActivityManager: at com.android.server.am.ActivityStack.removeTask(ActivityStack.java:5166)
04-20 18:47:36.246 3561 3871 D ActivityManager: at com.android.server.am.ActivityStack.removeActivityFromHistoryLocked(ActivityStack.java:4168)
04-20 18:47:36.246 3561 3871 D ActivityManager: at com.android.server.am.ActivityStack.removeHistoryRecordsForAppLocked(ActivityStack.java:4528)
04-20 18:47:36.246 3561 3871 D ActivityManager: at com.android.server.am.ActivityStack.handleAppDiedLocked(ActivityStack.java:5018)
04-20 18:47:36.246 3561 3871 D ActivityManager: at com.android.server.am.ActivityStackSupervisor.handleAppDiedLocked(ActivityStackSupervisor.java:2155)
04-20 18:47:36.246 3561 3871 D ActivityManager: at com.android.server.am.ActivityManagerService.handleAppDiedLocked(ActivityManagerService.java:5903)
04-20 18:47:36.246 3561 3871 D ActivityManager: at com.android.server.am.ActivityManagerService.appDiedLocked(ActivityManagerService.java:6083)
04-20 18:47:36.246 3561 3871 D ActivityManager: at com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied(ActivityManagerService.java:1885)
04-20 18:47:36.246 3561 3871 D ActivityManager: at android.os.BinderProxy.sendDeathNotice(Binder.java:1193)
eixt调用栈跟前面相同,由于都是app died,所以都是从binderDied开始。
3. 正常退出activity的调用栈,
04-20 18:45:54.757 3561 5832 D ActivityManager: setFocusStackUnchecked, focusCandidate:ActivityStack{c8ae027 stackId=3 type=standard mode=fullscreen visible=true translucent=true, 1 tasks}
04-20 18:45:54.757 3561 5832 D ActivityManager: java.lang.RuntimeException
04-20 18:45:54.757 3561 5832 D ActivityManager: at com.android.server.am.ActivityStackSupervisor.setFocusStackUnchecked(ActivityStackSupervisor.java:718)
04-20 18:45:54.757 3561 5832 D ActivityManager: at com.android.server.am.ActivityStack.moveToFront(ActivityStack.java:1057)
04-20 18:45:54.757 3561 5832 D ActivityManager: at com.android.server.am.ActivityStack.moveToFront(ActivityStack.java:1019)
04-20 18:45:54.757 3561 5832 D ActivityManager: at com.android.server.am.ActivityStack.adjustFocusToNextFocusableStack(ActivityStack.java:3461)
04-20 18:45:54.757 3561 5832 D ActivityManager: at com.android.server.am.ActivityStack.adjustFocusToNextFocusableStack(ActivityStack.java:3438)
04-20 18:45:54.757 3561 5832 D ActivityManager: at com.android.server.am.ActivityStack.adjustFocusedActivityStack(ActivityStack.java:3428)
04-20 18:45:54.757 3561 5832 D ActivityManager: at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:3735)
04-20 18:45:54.757 3561 5832 D ActivityManager: at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:3699)
04-20 18:45:54.757 3561 5832 D ActivityManager: at com.android.server.am.ActivityStack.requestFinishActivityLocked(ActivityStack.java:3539)
04-20 18:45:54.757 3561 5832 D ActivityManager: at com.android.server.am.ActivityManagerService.finishActivity(ActivityManagerService.java:5705)
04-20 18:45:54.757 3561 5832 D ActivityManager: at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:147)
04-20 18:45:54.757 3561 5832 D ActivityManager: at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3288)
04-20 18:45:54.757 3561 5832 D ActivityManager: at android.os.Binder.execTransact(Binder.java:731)
04-20 18:45:54.768 3561 5828 D ActivityManager: resumeTopActivityInnerLocked->next ActivityRecode:ActivityRecord{6d44d41 u0 com.xxx.xxx.mediaexplorer/.NewMainEntryActivity t4}
04-20 18:45:54.768 3561 5828 D ActivityManager: java.lang.RuntimeException
04-20 18:45:54.768 3561 5828 D ActivityManager: at com.android.server.am.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:2349)
04-20 18:45:54.768 3561 5828 D ActivityManager: at com.android.server.am.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2300)
04-20 18:45:54.768 3561 5828 D ActivityManager: at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:2251)
04-20 18:45:54.768 3561 5828 D ActivityManager: at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:1614)
04-20 18:45:54.768 3561 5828 D ActivityManager: at com.android.server.am.ActivityStack.activityPausedLocked(ActivityStack.java:1538)
04-20 18:45:54.768 3561 5828 D ActivityManager: at com.android.server.am.ActivityManagerService.activityPaused(ActivityManagerService.java:8166)
04-20 18:45:54.768 3561 5828 D ActivityManager: at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:224)
04-20 18:45:54.768 3561 5828 D ActivityManager: at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3288)
04-20 18:45:54.768 3561 5828 D ActivityManager: at android.os.Binder.execTransact(Binder.java:731)
从上面调用栈可以看到,正常finishAcitivity会调到AMS.finishActivity -> ActivityStack.adjustFocusToNextFocusableStack ->
ActivityStackSupervisor.getNextFocusableStackLocked找到下一个focusable stack,
ActivityStackSupervisor
ActivityStack getNextFocusableStackLocked(ActivityStack currentFocus, boolean ignoreCurrent) {
...
ActivityStack candidate = null;
for (int i = mTmpOrderedDisplayIds.size() - 1; i >= 0; --i) {
final int displayId = mTmpOrderedDisplayIds.get(i);
// If a display is registered in WM, it must also be available in AM.
final ActivityDisplay display = getActivityDisplayOrCreateLocked(displayId);
if (display == null) {
// Looks like the display no longer exists in the system...
continue;
}
//一般只有一块屏,display数量为1
for (int j = display.getChildCount() - 1; j >= 0; --j) {
//找到AcitivityDisplay最上面的ActivityStack即可
final ActivityStack stack = display.getChildAt(j);
if (ignoreCurrent && stack == currentFocus) {
continue;
}
...
return stack;
}
}
return candidate;
}
ActivityDisplay
protected ActivityStack getChildAt(int index) {
return mStacks.get(index);
}
/**
* All of the stacks on this display. Order matters, topmost stack is in front of all other
* stacks, bottommost behind. Accessed directly by ActivityManager package classes. Any calls
* changing the list should also call {@link #onStackOrderChanged()}.
*/
private final ArrayList mStacks = new ArrayList<>();
然后在activityPaused的时候resumeTopAcvity。
最后贴一下startActivity的调用栈,跟此题无关,作为学习AMS一个参考
04-20 18:45:47.231 3561 5828 D ActivityManager: setFocusStackUnchecked, focusCandidate:ActivityStack{db44efe stackId=11 type=standard mode=fullscreen visible=true translucent=true, 1 tasks}
04-20 18:45:47.231 3561 5828 D ActivityManager: java.lang.RuntimeException
04-20 18:45:47.231 3561 5828 D ActivityManager: at com.android.server.am.ActivityStackSupervisor.setFocusStackUnchecked(ActivityStackSupervisor.java:718)
04-20 18:45:47.231 3561 5828 D ActivityManager: at com.android.server.am.ActivityStack.moveToFront(ActivityStack.java:1057)
04-20 18:45:47.231 3561 5828 D ActivityManager: at com.android.server.am.ActivityStack.moveToFront(ActivityStack.java:1019)
04-20 18:45:47.231 3561 5828 D ActivityManager: at com.android.server.am.ActivityStarter.setTaskFromReuseOrCreateNewTask(ActivityStarter.java:2078)
04-20 18:45:47.231 3561 5828 D ActivityManager: at com.android.server.am.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1411)
04-20 18:45:47.231 3561 5828 D ActivityManager: at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:1200)
04-20 18:45:47.231 3561 5828 D ActivityManager: at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:868)
04-20 18:45:47.231 3561 5828 D ActivityManager: at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:544)
04-20 18:45:47.231 3561 5828 D ActivityManager: at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:1099)
04-20 18:45:47.231 3561 5828 D ActivityManager: at com.android.server.am.ActivityStarter.execute(ActivityStarter.java:486)
04-20 18:45:47.231 3561 5828 D ActivityManager: at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:5117)
04-20 18:45:47.231 3561 5828 D ActivityManager: at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:5091)
04-20 18:45:47.231 3561 5828 D ActivityManager: at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:5082)
04-20 18:45:47.231 3561 5828 D ActivityManager: at android.app.IActivityManager$Stub.onTransact$startActivity$(IActivityManager.java:10084)
04-20 18:45:47.231 3561 5828 D ActivityManager: at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:122)
04-20 18:45:47.234 3561 5828 I ActivityManager: at com.android.server.am.ActivityStack.startActivityLocked(ActivityStack.java:2932)
04-20 18:45:47.234 3561 5828 I ActivityManager: at com.android.server.am.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1439)
04-20 18:45:47.234 3561 5828 I ActivityManager: at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:1200)
04-20 18:45:47.234 3561 5828 I ActivityManager: at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:868)
04-20 18:45:47.234 3561 5828 I ActivityManager: at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:544)
04-20 18:45:47.234 3561 5828 I ActivityManager: at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:1099)
04-20 18:45:47.234 3561 5828 I ActivityManager: at com.android.server.am.ActivityStarter.execute(ActivityStarter.java:486)
04-20 18:45:47.234 3561 5828 I ActivityManager: at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:5117)
04-20 18:45:47.234 3561 5828 I ActivityManager: at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:5091)
04-20 18:45:47.234 3561 5828 I ActivityManager: at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:5082)
04-20 18:45:47.234 3561 5828 I ActivityManager: at android.app.IActivityManager$Stub.onTransact$startActivity$(IActivityManager.java:10084)
04-20 18:45:47.242 3561 5828 D ActivityManager: at com.android.server.am.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:2349)
04-20 18:45:47.242 3561 5828 D ActivityManager: at com.android.server.am.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2300)
04-20 18:45:47.242 3561 5828 D ActivityManager: at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:2251)
04-20 18:45:47.242 3561 5828 D ActivityManager: at com.android.server.am.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1466)
04-20 18:45:47.242 3561 5828 D ActivityManager: at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:1200)
04-20 18:45:47.242 3561 5828 D ActivityManager: at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:868)
04-20 18:45:47.242 3561 5828 D ActivityManager: at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:544)
04-20 18:45:47.242 3561 5828 D ActivityManager: at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:1099)
04-20 18:45:47.242 3561 5828 D ActivityManager: at com.android.server.am.ActivityStarter.execute(ActivityStarter.java:486)
04-20 18:45:47.242 3561 5828 D ActivityManager: at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:5117)
04-20 18:45:47.242 3561 5828 D ActivityManager: at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:5091)
04-20 18:45:47.242 3561 5828 D ActivityManager: at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:5082)
04-20 18:45:47.242 3561 5828 D ActivityManager: at android.app.IActivityManager$Stub.onTransact$startActivity$(IActivityManager.java:10084)