冷启动:
系统不存在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 由于广告页的需求,会使用第二种流程 ;但是尽量不要使用第三种和第四种启动流程,体验非常不好