最近应用
Recent Apps 是应用切换器和挂起应用注册表。它使用 LRU 链表保存可恢复的脚本应用,每个条目关联包 ID、App Activity、保存的子栈、页面快照和估算内存。
入口与行为
数字表冠短按保持系统点击语义,长按打开 Recent Apps 页面。选择卡片后恢复原来的 Activity 子栈和脚本上下文。应用切换不等于应用退出。
挂起流程
- 确认当前 Activity 属于可挂起的脚本应用。
- 分离 App Activity 子栈,把 View 放入不可见的 Parking Lot。
- 生成恢复动画快照和页面展示缩略图。
- 通过 SPM 将程序置为
SUSPENDED,暂停 SNI 定时器、动画和脚本回调。 - 将条目放到 MRU 端,再次使用时更新其位置。
恢复时重新附加子栈,按策略恢复资源,最后允许程序继续接收回调。
恢复策略
定时器可以在恢复时最多补发一次、补发遗漏回调(最多十次),或跳过遗漏回调并重新计时。动画可以从暂停位置继续,也可以跳到结束状态并触发完成回调。依赖实时周期的逻辑应使用系统时间,不要假定挂起期间定时器仍在运行。
驱逐与失败边界
Recent Apps 受条目数量和估算内存高水位限制,超过任一限制时从 LRU 尾部驱逐。驱逐会走完整停止和 teardown,不能只丢弃卡片。引擎复位、应用卸载时也会清理相关条目。
找不到包 ID 或条目已驱逐时,恢复失败且不创建半恢复程序;旧条目在引擎复位后不可恢复。挂起应用仍占用 Realm、View、快照、模块缓存和脚本对象的内存。