前言
最近看了一篇关于App启动页的文章,作者介绍了如何使闪屏页用正确的延时跳转到主界面,虽然文章是去年写的,但是作者推荐的启动页最小化延时的方法倒是挺符合当下火热的ReactiveX的思想:Less is More。当然为了营销在启动页植入广告是另一种使用场景。
原文链接:Splash Screens the Right Way,作者:Chris Stewart
如有译误,请指出。
正文
一想到闪屏我就有点生气,只是说这个词让我感觉不舒服。
闪屏页就是浪费你的时间,对吧?作为一个Android开发者,当我看见一个闪屏页面,我就会想到一些可怜的开发者不得不在自己的代码中塞入三秒的延时。
然后,我就得花三秒钟盯着这些图片直到我可以用这个应用,而且每当我启动它的时候我都得这样做,我知道我打开的是哪个应用,我也知道这个应用的功能,能不能让我直接快乐的玩耍。
Google的建议
你可能会惊讶Google竟然会提倡你去使用闪屏页,在Material Design规范中的这里提到了(译注:需科学上网)。
因为之前可不是这样的,Google曾经主张反对闪屏页,甚至称之为反面教材(译注:需科学上网)。

为什么?
闪屏页的正确使用
我认为Google并不是自相矛盾的,旧理念和新立场可以并存(这么说吧,使用闪屏页面去耗费用户的时间仍然不是一个好的想法,请不要那样做)
然而,Android的众多应用的确需要一定量的时间去启动,尤其是在冷启动上,这个延时启动你是无法避免的,与其在启动的时候留着白屏,为何不给用户展示有用的东西?这才是Google所倡导的方式。在用户第一次启动的时候,不要浪费用户的时间,但是也不要给他们留白屏
如果你去看最近Google的一些应用的更新,你会看到闪屏页合理的使用。例如,YouTube的应用:

你看闪屏所花费的时间,就是应用配置自己去启动所需要的时间。在冷启动上也是这样的,这就意味着这可能是启动比较缓慢。如果应用有缓存,闪屏界面将会几乎立即跳转。
闪屏页的实现
实现一个闪屏页的正确方式可能和你想象的有些不同,你得先准备好你所看到的splash view,甚至先于给你的SplashActivity准备好一个布局文件。
所以你都用不着布局文件,代替它的是将activity的主题背景指定为闪屏背景。实现这个,第一步是在res/drawable
目录下创建一个XML drawable。
注:所有的代码都在Github上。
这里我设置了一个背景色和一张图片。
然后,你要将这个设置到SplashActivity
的主题中作为背景。进入你的style.xml
文件,然后为闪屏页添加一个新的主题:
<!-- Customize your theme here. -->
<item name="android:windowBackground">@drawable/background_splash</item>
在你新建的SplashTheme
中设置它的windowBackground
属性为你之前建的XML drawable,然后到AndroidManifest.xml
中,将这个主题配置给你的SplashActivity
最后,你的SplashActivity
应该能直接跳转到MainActivity
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
}
注意你不需要为你的SplashActivity
设置一个视图,这个视图来自于主题,在主题中为你的SplashActivity
设置UI就足够了。
如果你的确需要为你的闪屏页设置一个布局文件,那这个布局文件将只在你的应用完全初始化完后才显示,这太迟了。因为在应用完成初始化之前,这个闪屏页只展示很短的时间。
预期结果
执行完这些步骤,你就以正确的方式完成了这个闪屏页:

学会了以上的知识,让你的闪屏页正确的运转起来。不要浪费用户的时间,并且在用户等待的时候展示给他们有用的东西。