外观
使用 singleTask 模式时,如果目标栈中已存在该 Activity,会发生什么?如何控制其行为?
标准回答
singleTask 复用已有页面时,会把它上面的页面移走,把新请求交给 onNewIntent。
- A → B → C 中 B 为 singleTask,再启动 B,通常变为 A → B。
- 处理 onNewIntent 中的新参数;需要让 getIntent 返回新 Intent 时调用 setIntent。
- 若不希望清理中间页面,应重新审视启动模式而不是期待额外开关。
通俗例子
任务栈是首页 A、列表 B、详情 C。B 为 singleTask,再打开 B 后常见结果是 A、B;B 不再执行 onCreate,而是在 onNewIntent 收到新参数。
深入解释
**旧对象怎样收到新数据:**复用后没有重新执行 onCreate,新 Intent 由 onNewIntent 送达。需要在这里更新当前设备 ID、查询数据和界面状态。
**为什么 getIntent 可能还是旧值:**onNewIntent 的参数是这次请求;Activity 保存的原 Intent 不会因此自动变成新参数。后续代码若依赖 getIntent,可按需要调用 setIntent 更新它。
易混淆点
复用不会重新执行 onCreate,不能只在 onCreate 读取跳转参数。
参考资料
内容来源
- Android · AI Agent 知识手册 · 原条目
1.3.2