启动分类:
冷启动、热启动、温启动。

冷启动流程

  1. 加载并启动APP
  2. 启动立即为该APP显示一个空白启动窗口

    谷歌为什么设计要显示一个白屏?因为碎片化的安卓系统,启动后真正显示入口页面的布局可能差的手机要5s,那么5s点击下去都没反应,会给用户造成很差的体验。所以要有一个白屏,让用户知道点击的瞬间,你已经打开了这个APP了。白屏不应该去避免。

  3. 创建APP进程(创建应用程序对象)

  4. 启动主线程,创建主Activity
  5. 加载布局,绘制

    热启动流程

  6. 热启动中,系统的所有工作就是将您的Activity带到前台。

  7. 如果应用的所有Activity都还驻留在内存中,则应用可以无需重复对象初始化、布局扩充和呈现。

    温启动

  8. 温启动涵盖在冷启动期间发生的操作的一系列子集。

  9. 同时,他的开销比热启动多。

阶段总结:不管启动方式有几种,针对冷启动优化做完,其他启动方式的优化也就完成。

黑白屏优化

方案一:
在启动Activity的xml中使用windowDisablePreview或者windowIsTranslucent。代价是启动的时候会卡几秒。

方案二:
在styles.xml文件中创建一个theme,然后设置这个theme的windowBackground为你要的启动图,然后指定启动Activity为你的这个Theme,然后在onCreate的第一行代码立刻又切换回到你App原先的主题(此时启动图已经显示完毕,可以切换回原主题了)。

方案三:
SplashActivity设置windowBackground,windowBackground里面用layer-list,可以设置背景+顶部图,然后setContentView里面再设置底部图。然后再等待1秒,可以再初始化一些代码,然后再跳转到MainActivity。�

启动时间测量

测量方式

  1. 系统logcat日志输出

    1. ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms
  2. adb

    1. adb [-d|-e|-s <serialNumber>] shell am start -S -W
    2. com.example.app/.MainActivity
    3. -c android.intent.category.LAUNCHER
    4. -a android.intent.action.MAIN

    输出内容如下:

    1. Starting: Intent
    2. Activity: com.example.app/.MainActivity
    3. ThisTime: 2044 # 代表最后一个Activity启动时间
    4. TotalTime: 2044 # 代表所有Activity的启动时间
    5. WaitTime: 2054 # ams启动Activity总耗时
    6. Complete
  3. 手动输出

    手动输出就是自己定义函数,计时,打印。

Android系统有几个关键的回调说明下:
Application的attachBaseContext是默认的第一个回调,比onCreate更早。
Activity的onResume之后,UI才会显示在界面上。
Activity的onWindowFocusChanged是首帧开始绘制的时候会回调。