开发Android的程序员都知道,自己开发APP时候,如果不做任何处理,在用户打开应用时总会先出现黑屏或者白屏,之后才进入MainActivity中。这是加载程序时间过长造成的。具体的启动原理我就不再这里叙述了,可以百度一下,很多博客讲的都很清楚。我这里只说主要的部分。简单来说,从用户点击应用时,程序会执行Application的onCreate和Activity(入口Activity)的onCreate,之后才进行界面的展示。所以说呢,我们尽量要减少onCreate方法中程序的执行,能进行懒加载的要进行懒加载;可以放在子线程中执行的要放在子线程中。这样可以使白屏时间减少。但是现在应用需要接入大量的三方,而且都要求方法Application中的onCreate方法中,导致优化onCreate的方法的行为很少了。那应该怎么办呢?
现在很多应用当点击的时候都不会出现黑白屏,而是先出现一个自定义的页面,过了不定时长之后进入应用内。这个方法就是很好的解决办法。具体怎么实现呢?
1.定义自己的主题风格
首先我们在style.xml文件中定义自己的主题,在android:windowBackgroud属性中写上替代白屏的图片。
<style name="AppTheme.MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/welcom_icon</item>
<item name="android:windowFullscreen">true</item>
</style>
2.给入口Activity设置刚刚定义的主题
<activity
android:name=".MainActivity"
android:theme="@style/AppTheme.MyTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
之后再在MainActivity中的onCreate方法中设置原本的主题进行恢复
setTheme(R.style.AppTheme)
再次启动App之后就会方法,自己替换的图片代替了黑白屏。
有的小伙伴会发现,由于手机尺寸不同,图片出现变形,造成的用户体验很不好。应该如果做呢?
1.创建drawable文件
需要注意的是,gravity需要设置为center
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/app_welcome"/>
</item>
</layer-list>
2.使用刚刚创建的drawable文件
<style name="AppTheme.MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/my_drawable</item>
<item name="android:windowFullscreen">true</item>
</style>
之后的操作和上面的一样。图片的大小和图片的位置(mipmap-hdpi,mipmap-xhdpi等)会影响图片的显示。这个图片我建议方法mipmap-xxhdpi中,大小为1080*1920。其中核心内容要小一点,边距留的大一点,这样适配的效果会很好。
其他内容:
还有两种方式也可以替代黑白屏的显示,那就是不让黑白屏展示出来。以下代码在自定义的主题中添加,替代android:windowBackground
<item name="android:windowIsTranslucent">true</item>
或
<item name="android:windowBackground">@null</item>
<item name="android:windowDisablePreview">true</item>
如果应用开始的延迟时间过长的话,点击应用没有任何反应,等加载完成之后直接进入应用。不会有黑白屏,也没有自己的图片。其实就是让黑白屏透明。这两种方法第二种要比第一种的内存消耗要小一点,第一种只是隐藏了黑白屏,但是依然会在内存中加载,第二种则不会加载内存。
关于黑白屏的问题就说到这里,欢迎评论,欢迎纠错!