App 启动方式
冷启动
App 没有启动过或 App 进程被杀,系统中不存在该 App 进程,此时启动即为冷启动。需要创建 App 进程,加载相关资源,启动 Main Thread,初始化首屏 Activity 等。在这个过程中,屏幕会显示一个空白的窗口(颜色基于主题),直至首屏 Activity 完全启动。
热启动
热启动意味着 App 进程只是处于后台,系统只是将其从后台带到前台展示给用户。类同与冷启动,在这个过程中,屏幕会显示一个空白的窗口(颜色基于主题),直至 activity 渲染完毕。
温启动
介于冷启动和热启动之间,一般来说在以下两种情况下发生:
- 用户返回退出了 App,然后又启动。进程可能还在运行,但是 activity 需要重建。
- 用户退出 App 后,系统可能由于内存原因将 App 杀死,进程和 activity 都需要重启,但是可以在 onCreate 中将被动杀死锁保存的状态(saved instance state)恢复。
启动时间检测
adb
adb shell am start -W
[应用报名]/[Activity的全路径名],得到三个时间值:
1、ThisTime
一般和 TotalTime 相同,如果应用启动开启了一个过渡用的全透明页面预处理一些事情,这样会比 TotalTime 小。
2、TotalTime
应用启动时间,包括创建进程、Application 初始化、Activity 初始化到显示。
3、WaitTime
一般比 TotalTime 大,包括系统的耗时。
代码打点
Application 的 attachBaseContext 在应用进程首先创建时调用,可做冷启动的开始打点。
优化
1、布局优化
2、逻辑优化
- 必要且耗时的逻辑,考虑单独开线程执行
- 必要不耗时,按优先级高低依次执行
- 非必要的延迟初始化,等用到再初始化
3、针对冷启动的欺骗效果
使用 placeholder UI
Android 最新的 Material Design 建议使用一个 placeholder UI 来展示给用户直至 App 加载完毕,类似 iOS 的做法。
自定义主题,设置 windowBackground 属性,给 Window 加上背景。
先加载一个不渲染布局的 Activity 作为启动屏
写一个什么都不做的 LogoSplashActivity
public class LogoSplashActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 这里并没有 setContentView,单纯只是用来跳转到相应的 Activity // 目的是减少首屏渲染 if (AppPref.isFirstRunning(this)) { IntroduceActivity.launch(this); } else { MainActivity.launch(this); } finish(); } }
在 AndroidManifest.xml 中设置其为启动屏,并加上主题
这样启动屏显示 LogoSplashActivity,本身不渲染布局,显示主题设置的 placehold UI 背景。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。