Android 避免APP启动闪黑屏的解决办法
概述
当系统启动一个APP时,zygote进程会首先创建一个新的进程去运行这个APP,但是进程的创建是需要时间的,在创建完成之前,界面是呈现假死状态,因为用户会以为没有点到APP而再次点击,这极大的降低用户体验,谷歌做出反馈去避免这段迷之尴尬。于是系统根据你的manifest文件设置的主题颜色的不同来展示一个白屏或者黑屏。而这个黑(白)屏正式的称呼应该是Preview Window,即预览窗口。所以,下面我们就来聊聊这个问题的解决方案。
解决方案
既然决定解决这个问题,那么从哪里入手呢,Android在选择展示黑屏或者白屏的时候,是根据你设定的主题而不同的,也就是说,虽然你的代码没有被执行,你的配置文件却被提前读取了,用来作为展示Preview Window界面的依据。
所以,我们的解决方案的切入口就是整个APP的manifest文件,更确切的说应该是主题配置文件。
res文件结构:
在drawable目录下新建一个根节点为layer-list的xml文件,如launch.xml
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/white"></item> <item> <bitmap android:gravity="center" android:src="@drawable/splash" android:tileMode="disabled" /> </item> </layer-list> |
splash 就是启动图
@color/white 是创建的背景颜色
values/color.xml :
1 2 3 4 5 |
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="black">#00000000</color> <color name="white">#FFFFFFFF</color> </resources> |
然后在创建 values/style.xml
1 2 3 4 5 6 7 |
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="welcome" parent="@android:style/Theme.NoTitleBar.Fullscreen"> <item name="android:windowFullscreen">true</item> <item name="android:windowBackground">@drawable/launch</item> </style> </resources> |
在activity 里应用样式:
1 2 3 4 5 6 7 8 9 |
<activity android:name="net.code2048.AppActivity" android:screenOrientation="portrait" android:configChanges="orientation|keyboardHidden|screenSize" android:label="@string/app_name" android:usesCleartextTraffic="true" android:theme="@style/welcome" android:launchMode="singleTask" android:taskAffinity="" > |
如果启动图过后黑屏时间依然太长 就把AppActivity 的onCreate 里的内容延迟执行一下 里面别放太多内容
参考资料:
https://www.jianshu.com/p/f358a584ef10
https://blog.csdn.net/u010351494/article/details/80034515
https://www.jianshu.com/p/22cf423774b5