冷启动流程
- 加载并启动APP
启动立即为该APP显示一个空白启动窗口
谷歌为什么设计要显示一个白屏?因为碎片化的安卓系统,启动后真正显示入口页面的布局可能差的手机要5s,那么5s点击下去都没反应,会给用户造成很差的体验。所以要有一个白屏,让用户知道点击的瞬间,你已经打开了这个APP了。白屏不应该去避免。
创建APP进程(创建应用程序对象)
- 启动主线程,创建主Activity
-
热启动流程
热启动中,系统的所有工作就是将您的Activity带到前台。
如果应用的所有Activity都还驻留在内存中,则应用可以无需重复对象初始化、布局扩充和呈现。
温启动
温启动涵盖在冷启动期间发生的操作的一系列子集。
- 同时,他的开销比热启动多。
阶段总结:不管启动方式有几种,针对冷启动优化做完,其他启动方式的优化也就完成。
黑白屏优化
方案一:
在启动Activity的xml中使用windowDisablePreview或者windowIsTranslucent。代价是启动的时候会卡几秒。
方案二:
在styles.xml文件中创建一个theme,然后设置这个theme的windowBackground为你要的启动图,然后指定启动Activity为你的这个Theme,然后在onCreate的第一行代码立刻又切换回到你App原先的主题(此时启动图已经显示完毕,可以切换回原主题了)。
方案三:
SplashActivity设置windowBackground,windowBackground里面用layer-list,可以设置背景+顶部图,然后setContentView里面再设置底部图。然后再等待1秒,可以再初始化一些代码,然后再跳转到MainActivity。�
启动时间测量
测量方式
系统logcat日志输出
ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms
adb
adb [-d|-e|-s <serialNumber>] shell am start -S -W
com.example.app/.MainActivity
-c android.intent.category.LAUNCHER
-a android.intent.action.MAIN
输出内容如下:
Starting: Intent
Activity: com.example.app/.MainActivity
ThisTime: 2044 # 代表最后一个Activity启动时间
TotalTime: 2044 # 代表所有Activity的启动时间
WaitTime: 2054 # ams启动Activity总耗时
Complete
手动输出
手动输出就是自己定义函数,计时,打印。
Android系统有几个关键的回调说明下:
Application的attachBaseContext是默认的第一个回调,比onCreate更早。
Activity的onResume之后,UI才会显示在界面上。
Activity的onWindowFocusChanged是首帧开始绘制的时候会回调。