冷启动和热启动
1. 冷启动
当启动应用时,后台没有该应用的进程,系统会重新创建一个新的进程分配给该应用,然后再根据启动的参数,启动对应的进程组件。
2. 热启动
当启动应用时,后台已有该应用的进程
(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动对应的进程组件。
1.冷启动优化
1.1 分析
谷歌对启动时长的定义
- ThisTime
最后一个 Activity 的启动耗时(例如从 LaunchActivity - >SplashActivity「adb命令输入的Activity」 , 只统计 SplashActivity 的启动耗时)
- TotalTime
所有Activity启动耗时
即应用的启动时间,包括 创建进程+Application初始化+Activity初始化到界面显示
非严谨、精确的时间,线下使用方面,线上不可用
- WaiteTime
ActivityManagerService启动App的总耗时
-
通过adb命令方式
-
通过logcat方式
1.1 视觉优化
App出现短暂黑屏和白屏现象。
其原因在于:应用启动时WindowManager会去加载App主题样式中的windowBackground 而这个背景是根据当前应用的主题背景色决定的
解决办法(优化视觉效果,对于启动耗时没有什么本质性帮助)
- App主题背景设置成透明样式
参考代码
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowFullscreen">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>
- App设置图片背景主题
参考代码
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/ic_launch</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
</style>
1.2 代码优化
- Application 初始化减负
将Bugly,友盟等组件放到子线程中初始化。(子线程初始化不能影响到组件的使用)
new Thread(new Runnable() {
@Override
public void run() {
//设置线程的优先级,不与主线程抢资源
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
// 子线程初始化第三方组件
}
}).start();
将需要在主线程中初始化但是可以不用立即完成的动作延迟加载
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//延迟初始化组件
}
}, 3000);
- 首页 Activity 减负
过于复杂的布局
加载大Bitmap