Android App 冷启动优化方案--黑白屏

每日一言:没有热忱,世间便无进步。

欢迎一起讨论和学习,QQ:732258496  QQ群:478720016

一.抛出问题

     关于android app启动页白屏黑屏和手机启动页图片跳跃闪屏的问题。

二.产生原因

  • 白屏或黑屏,具体是哪一个,取决于appTheme使用的是dark还是light主题

  • Android Studio 引起的白屏

    2.x时代的AS开启了instant run以后可能会导致白屏,但实际完整的apk包不会出现此问题

  • 冷启动引起的白屏/黑屏

    点击你app那一刻到系统调用Activity.onCreate()之间的时间段。在这个时间段内,WindowManager会先加载app主题样式中的windowBackground作为app的预览元素,然后再真正去加载activitylayout布局

  • 暖启动/热启动引起的白屏/黑屏

    这点在配置较好,内存空间充足的手机上不是很明显,但低端手机或者内存吃紧的情况下依旧会出现”闪屏”效果,持续时间很短,一闪而过

 

三.最优解决发方式(经多种方法对比得出)

     关键代码:<item name="android:windowFullscreen">true</item>

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="android:listDivider">@drawable/divider</item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/back</item>
        <item name="colorAccent">@color/title_back_color</item>
        <item name="android:windowFullscreen">true</item>
    </style>
   <!--parent设置为启动页的theme-->
    <style name="AppTheme.customTheme" parent="AppTheme">
        <item name="android:windowBackground">@drawable/iv_lead_page</item>
    </style>
 <application
        android:name=".BaseApplication"
        android:allowBackup="true"
        android:icon="@mipmap/icon"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme.customTheme">

四.APP启动优化汇总

    1.启动方式

       (1) 冷启动:当启动应用时,后台没有该应用的进程(常见如:进程被杀、首次启动等),这时系统会重新创建一个新的进程分配给该应用

       (2) 暖启动:当启动应用时,后台已有该应用的进程(常见如:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用

       (3) 热启动:相比暖启动,热启动时应用做的工作更少,启动时间更短。热启动产生的场景很多,常见如:用户使用返回键退出应用,然后马上又重新启动应用

        热启动和暖启动因为会从已有的进程中来启动,不会再创建和初始化Application

   2.优化

       我将冷启动优化分为可控阶段和不可控阶段

  • 不可控阶段

    点击app以后到初始化Application之间这段时间,系统接管,从Zygote进程中fork创建新进程,GC回收等等一系列操作,和我们app无关

  • 可控阶段

    初始化Application开始,如下图

    从上图可以看到,整个冷启动流程中至少有两处onCreate,分别是ApplicationActivity,整个流程都是可控的。所以,onCreate方法做的事情越多,冷启动消耗的时间越长

   3.优化方案(仅针对可控范围)

  • 从启动流程分析

    减少两处onCreate()中的初始化操作,将部分初始化移动到IntentService中进行

  • 从用户体验分析

    app首页的按返回键响应修改为响应Home键,曲线救国。让用户以为app确实退出了,但是实际上是点了Home键。如此一来,下次点击app图标的时候,直接唤起,不需要进行初始化操作,主要可以避免再次走闪屏页,参考美团,微信,QQ,淘宝等(实现的效果一样,但是实现方式就不得而知了)

    • 微博:启动后点击返回键和Home键的操作一样,底部选中tab没有做自切换
    • 美团:启动后点击返回键和Home键的操作不一样,底部选中tab做了自切换
    • QQ:同微博
    • 淘宝:启动后在首页按返回键,会先回到第一个tab,然后再退出

4.总结

  • 白屏/黑屏界面使用图片替换
  • onCreate中尽量避免做过多的初始化动作,如果必须,那么考虑IntentService
  • 首页中对BackHome键的动作做一些假象,使用户按Back键时以为他退出了,以减少下次启动的不必要动作(建议:非即时消息类和社交类app,这种做法慎用,因为可能有流氓之嫌。。。(逃)
  • Activity#moveTaskToBack(true)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄毛火烧雪下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值