You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Framework处理‘不保留活动’选项的机制及源码解析

Android Framework 对“不保留活动”选项的处理机制解析

一、后台切换时Activity销毁的Framework流程(源码线索)

当系统开启“不保留活动”选项(对应系统设置Settings.Global.ALWAYS_FINISH_ACTIVITIES),应用切换到后台后,Framework会触发Activity销毁流程,核心逻辑集中在ActivityManagerService(AMS)、ActivityStackSupervisor和ActivityStack中,关键步骤如下:

  1. 后台状态检测与触发
    应用进程进入后台后,AMS会在trimApplications()或handleAppTransitionTimeout()等方法中,检查系统是否开启“不保留活动”,同时判断目标Activity是否处于无前台关联的后台状态。

  2. 标记待销毁Activity
    AMS调用ActivityStackSupervisor.finishActivitiesInBackground(),遍历所有后台ActivityStack,对栈内ActivityRecord执行检查:

    // ActivityStackSupervisor.java
    public boolean finishActivitiesInBackground(String packageName, int userId) {
        boolean finished = false;
        for (int i = mStacks.size() - 1; i >= 0; i--) {
            final ActivityStack stack = mStacks.get(i);
            finished |= stack.finishBackgroundActivitiesIfNeeded(packageName, userId);
        }
        return finished;
    }
    

    在ActivityStack.finishBackgroundActivitiesIfNeeded()中,会判断当前栈是否处于后台且满足“不保留活动”条件,标记符合要求的Activity为待销毁。

  3. 执行销毁流程
    标记完成后,AMS通过ActivityStack.requestFinishActivityLocked()发送销毁请求,最终触发Activity的生命周期回调:onSaveInstanceState()(保存状态)→ onPause() → onStop() → onDestroy()。

二、单个Activity场景下ActivityStack的销毁与重建逻辑

1. 切换到后台时的ActivityStack处理

当应用仅有一个Activity且该Activity被销毁后,对应的ActivityStack(任务栈)会被移除,核心逻辑在ActivityStack.removeActivityLocked()中:

// ActivityStack.java
void removeActivityLocked(ActivityRecord r, boolean removeFromApp) {
    // ... 移除ActivityRecord的逻辑 ...
    if (mActivityList.isEmpty()) {
        // 栈内无剩余Activity,通知Supervisor移除当前栈
        mStackSupervisor.removeStack(this);
    }
}

当栈内最后一个Activity被销毁,mActivityList变为空,ActivityStackSupervisor会调用removeStack()将该ActivityStack从管理列表中移除,完成销毁。

2. 切换回前台时的重建逻辑

用户再次打开应用时,AMS会重新创建对应的ActivityStack(任务栈),并启动目标Activity:

  • AMS通过startActivityAsUser()发起请求,ActivityStackSupervisor会创建新的ActivityStack(若对应任务栈已不存在)。
  • 新的ActivityRecord被加入栈中,触发Activity重建流程:onCreate() → onRestoreInstanceState()(恢复保存的状态)→ onStart() → onResume()。

内容的提问来源于stack exchange,提问作者SnailBird

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 00:43:14