一、引言
使用Android智能手机用户都有碰到过,当一个APP启动时,有的APP启动界面会首先展示一个白屏或者黑屏,然后再进入欢迎页,稍作停留最后进入APP主页。
这个白屏或者黑屏的问题真的很影响体验,除非是垄断功能的APP,否则用户真的会越来越少。体验过一个XX银行的APP,启动页白屏至少5秒,垄断行业,你不得不用。但商业APP就必须得优化了、否则真会没人用。
二、问题的根源
我们分析下白屏或者黑屏的根源,当系统启动一个APP时,Zygote进程会首先创建一个新的进程去运行这个APP,但是进程的创建是需要时间的,在创建完成之前,界面是呈现假死状态的,这就很尴尬了,因为用户会以为没有点到APP而再次点击,这极大的降低用户体验,Android需要及时做出反馈去避免这段迷之尴尬。于是系统根据项目Manifest文件设置的主题颜色的不同来展示一个白屏或者黑屏。而这个白(黑)屏正式的称呼应该是Preview Window,即预览窗口。
三、解决方法(自定义Preview Window)
找着根源,那解决方案的切入口就是整个APP的Manifest文件,更确切的说应该是主题配置文件Android在选择展示黑屏或者白屏的时候,是根据你设定的主题而不同的,也就是说,虽然你的代码没有被执行,你的配置文件却被提前读取了,用来作为展示Preview Window界面的依据 --这就是自定义Preview Window。
3.1 配置Theme
在“style.xlm”文件中,添加如下主题:
<style name="StartAppTheme" parent="AppTheme">
<item name="android:windowBackground">@drawable/ic_bg</item>
</style>
3.2 配置Activity的主题
将主题设置到启动的Activity的主题中,WindowBackground就是即将展示的Preview Window。其中ic_bg可以是一整张图片,其实它也可以是一个能解析出图片资源的XML文件:
<activity
android:name=".activity.SplashActivity"
android:screenOrientation="portrait"
android:theme="@style/StartAppTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
这样设置之后,当你点击APP,会立马进入你配置的界面,然后启动欢迎页。
3.3 背景图设置为空
启动页做到这基本可以交货了,不过还有一个小问题需要处理,那就是在给Preview Window设置的背景图如果不做处理,图片就会一直存在于内存中,所以,当进入到欢迎页的时候,不要忘了把背景图设置为空:
@Override
protected void onCreate(Bundle savedInstanceState) {
//将window的背景图设置为空
getWindow().setBackgroundDrawable(null);
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
finish();
return;
}
if (SharePreferecnceUtils.getFirstLauncher() == 0) {
PrivacyDialogFragment fragment = new PrivacyDialogFragment();
fragment.show(getSupportFragmentManager(), "");
} else {
goToMainActivity();
}
}
好了,到这里,关于Android启动页白(黑)屏的问题就解决了。
四、扩展
在这里需要明确一点的是,Preview Window只能是静态图,它本身是不展示动画的,为了有更好的体验,当界面从 Preview Window 跳转到 欢迎页 的时候,欢迎页必须首先展示一个和Preview Window一模一样的界面,让人看起来好像界面还没切换一样,然后再慢慢切换到欢迎页,在进入欢迎页之后的展示一些动画。