Android 解决启动时白屏或黑屏问题

这个问题以前也注意过,但是因为现在项目中启动页一般都设置为了透明背景,所以没去在意

昨天看到一篇文章

知乎 救救你的 StartingWindow

然后就去细究了自己的应用为啥没有白屏,才发现是因为启动页设置了透明背景主题,这确实解决了黑屏或者白屏的问题,但是却没有解决冷启动的等待时长问题,也就是启动慢

这有一篇分析和解决此问题的文章

APP启动时白屏/黑屏

看起来确实是解决了,然后又看到了一篇文章

Android欢迎页短暂白屏问题以及解决方案

如果单纯的只是将启动页的背景设置为一张图片,会造成内存问题,这当然是不允许的。不过上面文章中的第三种方法其实也没有完全解决问题,至于时间有没有缩短这里也不去验证了

那该怎么做,我们现在知道是,啥也不干的时候,会出现白屏或者黑屏,这时候我们可以通过设置启动页的背景来解决这个问题,而设置透明背景治标不治本,可以利用设置背景颜色或者图片背景来实现秒开,但这样又会出现内存问题,所以如果我们在启动页关闭的时候释放这个背景所占用的内存呢?

综上总结方案

  • 设置背景主题

    1
    2
    3
    4
    5
    <style name="SplashTheme" parent="AppTheme">
    <item name="android:windowBackground">@drawable/splash</item>
    <item name="android:windowIsTranslucent">false</item>
    <item name="android:windowFullscreen">true</item>
    </style>
  • 在 AndroidManifest.xml 中给 SplashActivity 设置主题

    1
    2
    3
    4
    5
    6
    7
    8
    <activity
    android:name=".ui.activity.SplashActivity"
    android:theme="@style/SplashTheme">
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>
  • 如需必要,可以注释掉 SplashActivity 中 oncreate() 方法里头的 setContentView() 方法,这个看需求

  • 在 SplashActivity 生命周期结束的时候,释放掉 style中 android:windowBackground 的图片

    1
    2
    3
    4
    5
    override fun onDestroy() {
    super.onDestroy()

    window.setBackgroundDrawable(null)
    }

OK,以此记录