Android面试系列冷启动优化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xgangzai/article/details/82385472

什么是冷启动?

  1. 冷启动的定义

    冷启动就是在启动应用前,系统中没有该应用的任何进程信息时候的启动(第一次打开应用,或者杀死了这个app进程后的启动)

  2. 冷启动/热启动的区别

    热启动定义:用户使用app返回键退出应用,然后马上又重新启动应用。

    区别一:app的进程是否在手机中已经存在了,冷启动时app的进程并不存在,需要重新创建;热启动是App的进程已经存在了,不需要再重新创建。

    区别二:冷启动因为之前手机中没有App的进程2,先创建Application类,再创建MainActivity类;热启动会从已有的进程来启动,不会再走Application类,而是直接启动MainActivity类(注,一个应用重新进程的创建,到新进程的销毁,MyApplication类只初始化创建一次,也就是说热启动的时候,代码并不走MyApplication这个类)

  3. 冷启动时间的计算

    冷启动的时间值从应用启动(创建进程)开始计算,到完成视图的第一次绘制(即第一个Activity内容对用户可见)为止。

冷启动流程

  • Zygote进程中fork创建出一个新的进程
  • 创建初始化Application类,创建MainActivity类
  • setContentView布局,判断DecorView的存在,通过 inflate将View添加到DecorView的mContentParent中(DecorView会和ViewRoot的实现类ViewRootImpl有一个关联依赖,后面的几个方法是ViewRootImpl中的),这里用到了onMeasure/onLayout/onDraw这几个方法来完成里面View内容)
  • 当onCreate/onStart/onResume方法走完,Activity的onResume方法,接着会调用Activity的makeVisible(),在该方法中DecorView真正完成了添加显示到Window中,Activity的视图能被用户看到。

冷启动流程后引起的黑白屏错觉卡顿问题

  1. 黑白屏错觉卡顿问题出现的原因
    在冷启动流程第三步的时候View添加到了mCOntentParent中,但是这时候DecorView并没有被WindowManager识别,在第四步的makeVisiable()方法中
void makeVisable(){
    if(!mWindowAdded){
        ViewManager wm=getWindowManager();
        wm.addView(mDecor,getWindow.getAttributes());
        mWindowAdded=true;
    }
    mDecor.setVisibility(View.VISIBLE);
}

DecorView真正的完成了添加和显示这两个过程,但是wm会先加载APP里的主题样式里的窗口背景(windowBackground)作为预览元素,然后才去真正的加载布局,如果这个时间过长,而默认的背景又是黑色或者白色,这样会给用户造成一种错觉,这个APP很卡,很不流畅会出现黑色或者白色屏幕闪过,自然也影响了用户体验。

  1. 黑白屏错觉卡顿解决办法

(1)App启动页面为图片或者是drawable文件

//style中
<style name="ThemeSplash" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:background">@drawable/login_qdbg_new</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFullscreen">true</item>
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
//权限文件中
      <activity
            android:name=".ui.splash.SplashActivity"
            android:screenOrientation="portrait"
            android:theme="@style/ThemeSplash">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

设置设置整个App的style文件,设置Android:background属性为图片或者是drawable文件,这样App在启动过程中就是显示的是启动页面的图片或者是是drawable文件;

扫描二维码关注公众号,回复: 3703787 查看本文章

(2)App启动页面为Layout文件

这时候无法为App的style设置background,退而求其次主流的方式是设置白色背景

<item name="android:windowBackground">@color/color_ffffff</item>

而这里的@color/color_ffffff就是我们定义的白色色值,这样经过处理之后App启动时就不会出现黑屏的效果了。

如何优化冷启动的实际

  1. 在Application中的onCreate()方法中减少工作量,第三方sdk有一个懒加载操作判断使用的时候调用
  2. 不要让Application参与业务的操作
  3. 不要让Application进行耗时的操作(io操作大忌)
  4. 不要以静态变量的方式在Application中保存数据,静态变量生命周期和app是一样,会造成内存泄漏,数据安全等问题
  5. 布局/mainThread MainActivity,View层级减少,可以选择懒加载按需加载;有一些资源的初始化放在子线程中初始化

推荐链接:黑白屏卡顿分析:https://blog.csdn.net/zivensonice/article/details/51691136

猜你喜欢

转载自blog.csdn.net/xgangzai/article/details/82385472