任务快照是在 Android 8.0 中引入的基础架构,可将窗口管理器中的最近任务缩略图和已保存表面这两者的屏幕截图进行合并。最近任务缩略图会在“最近”视图中呈现任务的最后状态。
过去,当有 Activity 进入停止状态时,只要该 Activity 位于任务顶层,窗口管理器就不会销毁该 Activity 的表面。如果该 Activity 必须再次显示,窗口管理器便能够启动相应动画,而无需等待该 Activity 绘制完其第一帧,因为它能够使用这个已保存表面。
架构
通过任务快照,最近任务缩略图和已保存表面这两个概念合并在了一起。当有任务进入后台时,窗口管理器会将该任务的屏幕截图放入一个图形缓冲区中。只要任务顶层 Activity 的应用保留在内存中,该图形缓冲区就会保留在内存中。现在,当同一个 Activity 再次回到前面时,窗口管理器将会创建一个起始窗口 (TaskSnapshotSurface) 并附加图形缓冲区,而无需将任何内存复制到起始窗口的缓冲区队列。一旦该 Activity 绘制了其第一帧,任务快照起始窗口就会立即像常规启动画面一样平滑淡出。
系统还会将同一个图形缓冲区通过 Binder 发送到 SystemUI,以用于在“最近”视图中绘制任务的预览状态。由于这只是对缓冲区的引用,因此通过 Binder 发送它只需要多占用很少的资源。当该图形缓冲区到达 SystemUI 时,将会被封装到硬件位图中,然后被绘制到屏幕上,而无需将任何内存上传到图形内存。
优点
这种新架构有以下三个主要优点:
如果将任务快照用作起始窗口,快照和实际内容之间会有一个很好的交叉淡入淡出过程。
在 SystemUI 中绘制任务快照时,无需进行任何复制操作即可完成。以