为什么kill前台app会返回到桌面?

最近遇到一个问题,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)

 

你可能感兴趣的:(android,android,framework)