Android Framework处理‘不保留活动’选项的机制及源码解析
一、后台切换时Activity销毁的Framework流程(源码线索)
当系统开启“不保留活动”选项(对应系统设置Settings.Global.ALWAYS_FINISH_ACTIVITIES),应用切换到后台后,Framework会触发Activity销毁流程,核心逻辑集中在ActivityManagerService(AMS)、ActivityStackSupervisor和ActivityStack中,关键步骤如下:
后台状态检测与触发
应用进程进入后台后,AMS会在trimApplications()或handleAppTransitionTimeout()等方法中,检查系统是否开启“不保留活动”,同时判断目标Activity是否处于无前台关联的后台状态。标记待销毁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为待销毁。执行销毁流程
标记完成后,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

