APP冷启动流程

137 阅读2分钟

冷启动:

系统不存在App进程(App首次启动或者App被完全杀死)时启动App(后台没有该应用的进程,这时系统会又一次创建一个新的进程分配给该应用),此时,App的启动将经历两个阶段:

第一阶段:

1.加载并启动app

2.app启动后,第一时间为app显示一个空白的window

3.创建app进程

第二阶段:

系统一旦创建了app进程,app进程就要负责做以下的任务:

1.创建app对象

2.创建ActivityThread

3.创建MainActivity

4.渲染视图

5.执行onLayout

6.执行onDraw

7.完成第一次绘制后,把mainActivity替换已经展示的BackgroundWindow,即空白window。

也就是说冷启动由于系统会又一次创建一个新的进程分配给它。所以会先创建和初始化Application类,再创建和初始化MainActivity类(包含一系列的測量、布局、绘制),最后显示在界面上。

ActivityThread:负责管理应用程序的生命周期,处理消息队列,处理用户输入事件,调度Activity的创建和销毁等等。
具体来说,ActivityThread会在应用程序启动时会创建一个主线程(也就是UI线程),然后根据AndroidManifest.xml文件中声明的启动Activity,创建一个Activity对象,并通过Binder机制将这个Activity对象传递给ActivityManagerService。Activity还会负责处理Activity的生命周期,比如当用户按下返回键退出当前Activity时,ActivityThread会收到相应的消息,然后销毁当前Activity并恢复上一个Activity的状态。ActivityThread还负责处理其他一些系统事件,比如屏幕旋转、系统资源不足等等,这些事件都会通过消息队列传递给ActivityThread,然后由ActivityThread调度处理。

减少Activity的跳转层次

StartingWindow 会在用户点击 App 后立即创建并显示(前提是 App 没有禁止 StartingWindow),在 AppWindow 创建好之后,StartingWindow 消失,AppWindow 显示

默认 App 的启动窗口流程

StartingWindow(SystemWindow)

->MainActivity(AppWindow)

大部分三方 App 启动流程

StartingWindow(SystemWindow)

-> SplashActivity(AppWindow)

-> MainActivity(AppWindow)

糟糕一点的启动流程是这样的

StartingWindow(SystemWindow)

-> MainActivity(AppWindow)

-> SplashActivity(AppWindow)

-> MainActivity(AppWindow)

更糟糕一点的启动流程:去掉了 StartingWindow

SplashActivity(AppWindow)

-> MainActivity(AppWindow)

其实对用户来说,第一种启动流程是最好的,只涉及到一次窗口的切换;但是部分 App 由于广告页的需求,会使用第二种流程 ;但是尽量不要使用第三种和第四种启动流程,体验非常不好