Skip to content
阅读进度

使用 singleTask 模式时,如果目标栈中已存在该 Activity,会发生什么?如何控制其行为? ​

返回 Android 核心 目录

标准回答 ​

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 读取跳转参数。

参考资料 ​

内容来源 ​

用完整回答理解机制,用真实证据解释项目。