流程简述
Startingwindow的创建时机在Activity的启动时。前面提到Activity的启动是需要一个空白页或者截图页面过渡的,所以在系统进程收到的Activity的启动请求时,根据不同的场景分配不同的启动窗口类型,绘制启动出口startingwindow的移除时机在activity的绘制完成之后,当Activity完成绘制之后,Startingwindow的使命页结束了,所以移除。
启动窗口Starting Window主要分为两种:SplashScreen和Snapshot,前者为冷启栈(进程可能存在,但是一定是跨栈冷起栈场景),后者为热启复用栈场景;当然还有一种none类型,比如应用内页面跳转这种就不涉及startinwindow,所以是none类型。Starting Window功能是作为页面启动的过渡预览,提升启动速度和用户体验,因为正常页面启动需要耗费300-500ms时间,如果冷起场景由于要启动进程,这个过程甚至长达1-2s,如果没有过渡页,用户体验不佳。
startingwindow的框架
系统侧
·Task
存放task的activityRecord的容器,也是处理activityRecord生命周期的主要参与者。startingwindow的启动流程起点就是task.startActivityLocked()(注:Android12之后的版本已经没有ActivityStack这个类,ActivityStack和Task统一由Task表示,因此为task.startActivityLocked())
·ActivityRecord
系统进程中的Activity,也就是窗口容器,activity窗口和启动窗口都是它的child,因此启动窗口的添加和移除都是由ActivityRecord负责。
·WindowState
系统进程中的窗口,在窗口管理系统中时空指页面大小位置等属性的基本单元。startingwindow启动中回创建一个TYPE_APPLICATION_STARTING窗口类型的WindowState。
·StartingData
抽象了startingwindow的数据模型,负责构造startingsurface。
·SplashScreenStartingData
闪屏类型启动窗口的startingData实现,封装了闪屏类型启动窗口所需要的数据,如theme,icon,windowflags等等,这些数据来源于ActivityRecord。
·SnapshotStartingData
快照类型启动窗口的startingData实现,持有了TaskSnapshot。
·StartingSurfaceController
由TaskOrganizer.java和TaskOrganizerController.java打通从系统框架到wmshell的通路,从而与wmshell侧的StartingWindowController互交。
wmshell侧
·StartingWindowController
startingwindow的添加和移除最终的调用都在这里
·StartingSurfaceDrawer
startingwindow的添加和移除的实现
添加流程
移除流程
应用启动状态
应用有三种启动状态,每种状态都会影响应用向用户显示所需的时间:冷启动、温启动或热启动。在冷启动中,应用从头开始启动。在另外两种状态中,系统需要将后台运行的应用带入前台。建议您始终在假定冷启动的基础上进行优化。这样做也可以提升温启动和热启动的性能。
1、冷启动
冷启动是指应用从头开始启动:系统进程在冷启动后才创建应用进程。发生冷启动的情况包括应用自设备启动后或系统终止应用后首次启动。这种启动给最大限度地减少启动时间带来了最大的挑战,因为系统和应用要做的工作比在另外两种启动状态中更多。
在冷启动开始时,系统有三个任务,分别是:
·加载并启动应用。
·在启动后立即显示应用的空白启动窗口。
·创建应用进程。
系统一创建应用进程,应用进程就负责后续阶段:
·创建应用对象。
·启动主线程。
·创建主 activity。
·扩充视图。
·布局屏幕。
·执行初始绘制。
一旦应用进程完成第一次绘制,系统进程就会换掉当前显示的后台窗口,替换为主 activity。此时,用户可以开始使用应用。
2、温启动
温启动包含了在冷启动期间发生的部分操作;同时,它的开销要比热启动高。有许多潜在状态可视为温启动。例如:
·用户在退出应用后又重新启动应用。进程可能已继续运行,但应用必须通过调用 onCreate() 从头开始重新创建 activity。
·系统将您的应用从内存中逐出,然后用户又重新启动它。进程和 activity 需要重启,但传递到 onCreate() 的已保存的实例 state bundle 对于完成此任务有一定助益。
3、热启动
应用的热启动比冷启动简单得多,开销也更低。在热启动中,系统的所有工作就是将您的 activity 带到前台。只要应用的所有 activity 仍驻留在内存中,应用就不必重复执行对象初始化、布局膨胀和呈现。
但是,如果一些内存为响应内存整理事件(如 onTrimMemory())而被完全清除,则需要为了响应热启动事件而重新创建相应的对象。
热启动显示的屏幕上行为和冷启动场景相同:
在应用完成 activity 呈现之前,系统进程将显示空白屏幕。