Android App 启动页面黑屏的问题,现象表现为:Android 开发 App 启动时若没有作特殊处理的话,会出现一瞬间的白屏现象。即便启动页界面就加载一个布局,不作其余耗时处理,貌似也会出现一瞬间的白屏问题。当从桌面 Launcher 的小图标点击冷启动一个 App 的时候,程序须要进行一些基本的初始化操做,例如在Application 或者SplashActivity中作了不少耗时操做,例如初始化第三方SDK等,当手机性能很差,配置不高时,该现象尤为明显。android
注意,有些地方也称黑屏,主要是看给 App 设置的 Style 样式。异步
2、启动页黑屏问题分析ide
为何存在这个问题?主要在于如下几点:布局
1. 当系统启动一个 App 时,zygote进程会首先建立一个新的进程去运行这个 App,可是进程的建立是须要时间的,在建立完成以前,界面是呈现假死状态,因而系统根据你的manifest文件设置的主题颜色的不一样来展现一个白屏或者黑屏。而这个黑(白)屏正式的称呼应该是Preview Window,即预览窗口。性能
2. 此问题的现象实际上就是是Activity默认的主题中的android:windowBackground为白色或者黑色致使的。动画
3. 启动顺序总结实际为:App启动——Preview Window(也称为预览窗口)——启动页。spa
Android 在选择展现黑屏或者白屏的时候,是根据你设定的主题而不一样的,也就是说,虽然你的代码没有被执行,你的配置文件却被提早读取了,用来做为展现Preview Window界面的依据。因此,解决方案的切入口就是整个APP的manifest文件,更确切的说应该是主题配置文件。code
设置配置文件style样式中的windowBackground这个属性来显示一张背景图还有一个效果就是启动应用程序会感受很是快,并且与加载MainActivity的contentView是异步的。blog
解决办法:给当前启动页添加一个有背景的style样式进程
设置style样式以下:
<style name="SplashTheme" parent="AppTheme"> <item name="android:windowBackground">@mipmap/splash</item> <item name="android:statusBarColor" tools:ignore="NewApi">@color/white</item> <item name="android:windowIsTranslucent">true</item> </style>
注意,在清单文件中:
<activity android:name=".SplashActivity" android:theme="@style/SplashTheme"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
通过处理以后App启动时就不会出现一瞬间白屏的效果:
将主题设置到启动的Activity的主题中,windowBackground就是即将展现的preview window。其中splash能够是一整张图片,它也能够是一个能解析出图片资源的XML文件。
该方案注意要点:给Preview Window设置的背景图若是不作处理,图片就会一直存在于内存中,因此,当咱们进入到欢迎页的时候,不要忘了把背景图设置为空:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
//将window的背景图设置为空
getWindow().setBackgroundDrawable(null);
super.onCreate(savedInstanceState);
}
这样操做如何屏幕适配呢? 答:这样经过样式style设置SplashActivity加载图,不能像imageView那样能够设置缩放功能,所以能够采用.9图片。
禁止加载Preview Window,具体作法以下:
<style name="SplashTheme" parent="@style/Theme.AppCompat.Light.NoActionBar"> <item name="android:windowDisablePreview">true</item> </style>
设定为启动的Activity的主题,便可禁止Preview Window,固然,也有人经过把preview window设置为全透明,也达成了相似的效果。
windowDisablePreview的做用:经过设置android:windowDisablePreview属性,禁用窗口的预览动画,在SplashActivity显示以前,系统永远不会使用窗口的主题来显示它的预览,这也保证了不会出现白屏或者黑屏。可是,与设置android:windowIsTranslucent属性同样,若是在SplashActivity启动的时候,有过多复杂的操做,就会出如今手机中点击了应用程序的图标,但过n秒才会打开应用程序很差的卡顿体验效果。
该方案是否有缺点?有,点击后短暂的那几百毫秒没有反应,就好像“假死”了同样,过了一下子才跳出咱们应用程序的第一个Activity。