Android中finish Splash再启动Main后最近任务异常问题求助
Android SingleTask 启动模式:为何最近任务恢复时显示的Activity不一样?
嘿,这个现象确实挺有意思的,本质上是Android任务栈(Task Stack)的恢复逻辑在起作用,咱们结合singleTask的特性来掰扯清楚两种场景的差异:
先复习下singleTask的核心特性
singleTask模式的Activity有两个关键行为:
- 它会优先进入与自己
taskAffinity匹配的任务栈(默认是App的包名,也就是App的默认任务栈); - 如果目标任务栈中已经存在该Activity实例,会把它调到栈顶,并清除它上方的所有Activity;如果不存在,则直接入栈。
场景1:先finish Splash,再启动Main
咱们一步步捋任务栈的变化:
- 启动App,系统创建App的默认任务栈,Splash作为根Activity入栈:
[Splash] - 调用
finish()关闭Splash,此时任务栈被清空; - 启动Main(
singleTask模式):因为默认任务栈是空的,系统会复用这个栈,把Main设为新的根Activity入栈:[Main]; - 按返回键,Main被finish,任务栈再次清空,系统销毁这个任务栈;
- 从最近任务恢复时:系统会读取这个任务栈的最后状态——它的根Activity已经变成了Main,所以直接启动Main,而不是默认的启动页Splash。
场景2:先启动Main,再finish Splash
再看这个场景的任务栈流转:
- 启动App,默认任务栈创建,Splash作为根Activity入栈:
[Splash]; - 启动Main(
singleTask模式):因为栈里没有Main实例,直接入栈,此时栈结构是:[Splash, Main]; - 调用
finish()关闭Splash,栈变成:[Main]——注意!这里任务栈的原始根Activity仍然是Splash,只是Splash实例已经被销毁了; - 按返回键,Main被finish,任务栈清空,系统销毁任务栈;
- 从最近任务恢复时:系统识别到这个任务栈的根Activity是Splash(也就是App的默认启动Activity),所以会正常启动Splash,走常规的App启动流程。
验证小技巧
如果想直观看到任务栈的变化,可以用adb命令查看:
adb shell dumpsys activity tasks
执行后能清晰看到每个任务栈的根Activity、栈内Activity列表,两种场景的差异一眼就能看出来~
内容的提问来源于stack exchange,提问作者韩建飞
相关产品推荐
相关产品推荐

