#AI来了要静心 #每天学点 #Android #Java #面试 #知识打卡
大多数人对 singleTask 的理解是"整个栈里只留一个实例",但这个理解漏掉了关键细节——它清的不是整个任务栈,而是只清除目标 Activity 之上的所有 Activity。
singleTask 的本质是"任务栈中的单例"。当启动一个 singleTask Activity 时,系统会检查目标任务栈中是否已存在该 Activity 实例。如果存在,就复用并调用 onNewIntent;如果不存在,才创建新实例。真正容易被忽略的是:一旦找到已有实例,系统会把这个实例上方所有的 Activity 全部弹出,使该实例成为新的栈顶。这个清栈行为是 singleTask 与其他启动模式最核心的区别。
taskAffinity 决定了 Activity 归属哪个任务栈。默认情况下,taskAffinity 等于应用包名,同一应用的 Activity 默认在同一个任务栈中运行。但如果为 Activity 设置了不同的 taskAffinity,启动时系统可能会在新的任务栈中创建该 Activity,这直接影响 singleTask 的查找范围。很多混淆来源于没有意识到:singleTask 的"栈中单例"是相对于特定任务栈而言的。
singleTop 和 FLAG_ACTIVITY_CLEAR_TOP 看似都涉及复用,但行为完全不同。singleTop 只检查栈顶是否是目标 Activity,栈中间的实例会被完全忽略。FLAG_ACTIVITY_CLEAR_TOP 则更彻底——如果目标 Activity 在栈中存在但不是栈顶,它会先弹出栈顶的 Activity,然后复用目标 Activity。两者都会调用 onNewIntent,但触发条件截然不同。
另一个常见误区是认为 singleTask 和 FLAG_ACTIVITY_NEW_TASK 等价。FLAG_ACTIVITY_NEW_TASK 会在不存在匹配任务栈时创建一个新栈,但不会自动执行清栈操作。singleTask 则在找到实例后强制清除上方的 Activity,这是本质区别。理解这些差异,才能在复杂的任务栈场景中做出正确选择。
记住每种 launchMode 的行为固然重要,但理解背后的设计意图——为什么要这样设计、是为了解决什么场景问题——才是面试和工程实践中真正有价值的东西。