Starting window添加移除流程

流程简述

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的添加和移除的实现

添加流程

https://img-blog.csdnimg.cn/01e43f89ee4644ed93e8bc798e2efbc5.png

移除流程

应用启动状态

应用有三种启动状态,每种状态都会影响应用向用户显示所需的时间:冷启动、温启动或热启动。在冷启动中,应用从头开始启动。在另外两种状态中,系统需要将后台运行的应用带入前台。建议您始终在假定冷启动的基础上进行优化。这样做也可以提升温启动和热启动的性能。

1、冷启动

冷启动是指应用从头开始启动:系统进程在冷启动后才创建应用进程。发生冷启动的情况包括应用自设备启动后或系统终止应用后首次启动。这种启动给最大限度地减少启动时间带来了最大的挑战,因为系统和应用要做的工作比在另外两种启动状态中更多。

在冷启动开始时,系统有三个任务,分别是:

·加载并启动应用。

·在启动后立即显示应用的空白启动窗口。

·创建应用进程。

系统一创建应用进程,应用进程就负责后续阶段:

·创建应用对象。

·启动主线程。

·创建主 activity。

·扩充视图。

·布局屏幕。

·执行初始绘制。

一旦应用进程完成第一次绘制,系统进程就会换掉当前显示的后台窗口,替换为主 activity。此时,用户可以开始使用应用。

2、温启动

温启动包含了在冷启动期间发生的部分操作;同时,它的开销要比热启动高。有许多潜在状态可视为温启动。例如:

·用户在退出应用后又重新启动应用。进程可能已继续运行,但应用必须通过调用 onCreate() 从头开始重新创建 activity。

·系统将您的应用从内存中逐出,然后用户又重新启动它。进程和 activity 需要重启,但传递到 onCreate() 的已保存的实例 state bundle 对于完成此任务有一定助益。

3、热启动

应用的热启动比冷启动简单得多,开销也更低。在热启动中,系统的所有工作就是将您的 activity 带到前台。只要应用的所有 activity 仍驻留在内存中,应用就不必重复执行对象初始化、布局膨胀和呈现。

但是,如果一些内存为响应内存整理事件(如 onTrimMemory())而被完全清除,则需要为了响应热启动事件而重新创建相应的对象。

热启动显示的屏幕上行为和冷启动场景相同:

在应用完成 activity 呈现之前,系统进程将显示空白屏幕。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SNAPSHOT版本是指不稳定且仍在开发中的版本,也被称为快照版本。它的版本号以-SNAPSHOT结尾。SNAPSHOT不是一个特定的版本,而是一系列版本的集合,其中HEAD指向最新的快照版本。使用SNAPSHOT版本的客户端可以通过重新构建(有时可能需要使用-U参数强制更新)来获取最新的代码。这给人的印象是新的版本覆盖了旧的版本。 在Maven项目中,根据模块的版本号(pom文件中的依赖版本)是否带有-SNAPSHOT后缀,来判断是快照版本还是正式版本。如果是快照版本,在运行mvn deploy命令时,会自动将快照版本发布到快照版本库中,并覆盖旧的快照版本。而使用快照版本的模块,在不更改版本号的情况下,直接进行编译打包时,Maven会自动从镜像服务器中下载最新的快照版本。如果是正式版本,在运行mvn deploy命令时,会自动将正式版本发布到正式版本库中。而使用正式版本的模块,在不更改版本号的情况下,如果本地已经存在该版本的模块,则不会主动从镜像服务器上下载最新的版本。 SNAPSHOT版本主要适用于需要频繁更新和快速迭代的开发场景。这样可以方便开发人员在进行增量开发和测试时,随时获取最新的代码和功能。同时,SNAPSHOT版本也可以用于内部测试或者共享给其他团队成员,以便他们及时了解和使用最新的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [MAVEN的SNAPSHOT版本与RELEASE版本](https://blog.csdn.net/goodjava2007/article/details/123048156)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [SNAPSHOT版本](https://blog.csdn.net/ok3356/article/details/127384253)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值