问题描述
在安卓项目开发中,我们在启动app的时候,屏幕会出现一段时间的白屏或者黑屏,不同设备时间长短不同。很影响用户体验,所以我们很有必要对其进行优化。
黑白屏问题出现的原因当我们启动一个app时,如果该app所属的application还没有在后台运行的话,系统会首先创建一个新的进程去运行这个app,但进程的创建与初始化都是需要时间的,在这个动作完成之前,如果初始化的时间过长,屏幕上可能没有任何动静,用户会以为没有点到app而再次去点击应用图标,这极大的降低了用户体验,因此android需要及时做出反馈去响应用户的点击启动动作,这就有了startingwindow(也称之为previewwindow的预览窗口)的出现,这样看起来就像app已经启动起来了,只是数据内容还没有初始化好。
startingwindow一般出现在应用程序进程创建并初始化成功前,目的是告诉用户,系统已经接受到操作,正在响应,在程序初始化完成后绘制好启动页ui,会同时移除这个窗口,所以他只是一个临时的窗口。
一般情况下我们会对application和activity设置theme,系统会根据设置的theme初始化startingwindow。window布局的顶层是decorview,startingwindow显示一个空decorview,但是会给这个decorview应用这个activity指定的theme中设置的背景色,如果这个activity没有指定theme就用application的theme(application系统要求必须设置theme),我们在style中的设置就决定了显示的是白屏还是黑屏,如下:
<application // .... android:theme="@style/apptheme">
如果我们的apptheme像如下定义的一样使用了light主题,那么显示就是白屏,反之如果使用black主题,那么显示就是黑屏:
<style name="apptheme" parent="theme.appcompat.light.noactionbar">
解决方案1、首先在res/drawable下新建一个layer-list,名字随便取,比如splash.xml:
layer-list的编写参考:https://www.jb51.net/article/130850.htm
<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 背景颜色 --> <item android:drawable="@color/white" /> <item> <!-- 图片 --> <bitmap android:gravity="center" android:src="@drawable/wel_page" /> </item></layer-list>
layer-list大家都会写吧,上面是背景颜色,下面是一张图,这张图可以是全屏的图,可以是一张小图。如果是全屏的图,那上面的颜色也可以不用设置,如果是小图,就要指定下颜色了,并且可以指定图片所在位置。
2、给主题设置window背景:可以用我们上面的layer-list作为背景,当然也可以设置个全屏的图片。
<style name="splashtheme" parent="appbasetheme"> <!-- 欢迎页背景引用刚才写好的 --> <item name="android:windowbackground">@drawable/splash</item> <item name="android:windowfullscreen">true</item> <!-- <item name="android:windowistranslucent">true</item> --> <!-- 透明背景不要了 --></style>
3、在androidmanifest.xml中定义splashactivity的theme为splashtheme:这里注意application使用的theme是apptheme,而splashactivity使用的主题是splashtheme。这样做的效果是只要splashactivity使用startapptheme主题,其他activity都是用apptheme主题哦。
<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>
4、splashactivity的实现,在oncreate()中直接启动你的mainactivity即可,没有setcontentview():
public class splashactivity extends activity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); // setcontentview(r.layout.activity_load_sir); new handler().postdelayed(new runnable() { @override public void run() { intent intent = new intent(splashactivity.this,mainactivity.class); startactivity(intent); finish(); } }, 3000); }}
扩展在上面第二步中提到可以不使用layer-list,直接设置背景为图片,但是不推荐使用直接使用.png图片作为背景的方式,因为屏幕尺寸太多,图片显示会变形,如果可以我们也可以使用.9.png的背景图来实现,但是使用图片的方式存在一个缺陷就是splash图片是写在theme中的,图片的内存释放不掉,而使用layer-list比较节省内存。
相关推荐:
php for android项目
android animation_html/css_web-itnose
以上就是启动页进入时有短暂黑屏或白屏现象的终极解决方案的详细内容。