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
    评论
当Docker容器状态显示为"starting"时,通常是由于容器启动过程中出现的问题造成的。有几个常见的原因可能导致容器无法成功启动: 1.镜像问题:检查所使用的Docker镜像是否存在问题。可能是镜像已损坏、缺少所需的依赖项或配置文件等。您可以尝试重新拉取或重新构建容器镜像。 2.资源限制:您的主机可能没有足够的资源(例如CPU、内存或存储空间)来运行容器。您可以尝试增加主机资源或分配更多资源给容器来解决此问题。 3.端口占用:如果容器使用的端口已被其他进程占用,容器可能无法成功启动。您可以检查主机上已使用的端口,并确保容器使用的端口没有被占用。 4.运行时错误:某些容器在运行时可能会出现错误,导致容器无法启动。您可以检查容器日志或运行容器时使用适当的选项以便显示任何错误信息。 如果容器状态一直显示为"starting",可以尝试以下步骤来诊断和解决问题: 1.检查Docker日志:在命令行界面中使用"docker logs <container_id>"命令来查看容器的日志信息。这可能会提供有关容器启动失败的详细错误信息。 2.检查主机资源:确保您的主机有足够的资源来运行容器。您可以使用"docker stats"命令来监视主机资源的使用情况,确保不超过资源限制。 3.尝试使用其他镜像:如果使用的镜像存在问题,可以尝试使用其他可靠的镜像来启动容器,看是否能够成功。 4.检查容器配置:确保容器的配置文件正确,没有缺少任何必需的依赖项或配置。 5.尝试重新启动Docker服务:有时,重新启动Docker服务可能会解决容器启动问题。您可以使用适当的命令或服务管理工具来重启Docker服务。 总之,当Docker容器一直显示为"starting"时,需要定位和解决问题的根本原因。通过仔细检查容器日志、检查主机资源、尝试其他镜像和重新启动Docker服务等步骤,您有机会成功启动容器。如果问题仍然存在,可以尝试搜索相关的错误信息或寻求社区的帮助来解决问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值