前言

最近看了一篇关于 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 上。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">   
    <item
        android:drawable="@color/gray"/>
    <item>
    <bitmap
        android:gravity="center"
        android:src="@mipmap/ic_launcher"/>    
    </item>   
</layer-list>

这里我设置了一个背景色和一张图片。

然后,你要将这个设置到 SplashActivity 的主题中作为背景。进入你的 style.xml 文件,然后为闪屏页添加一个新的主题:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>    
    <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@drawable/background_splash</item>
    </style>
</resources>

在你新建的 SplashTheme 中设置它的 windowBackground 属性为你之前建的 XML drawable,然后到 AndroidManifest.xml 中,将这个主题配置给你的 SplashActivity

<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>

最后,你的 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 就足够了。
  如果你的确需要为你的闪屏页设置一个布局文件,那这个布局文件将只在你的应用完全初始化完后才显示,这太迟了。因为在应用完成初始化之前,这个闪屏页只展示很短的时间。

预期结果

  执行完这些步骤,你就以正确的方式完成了这个闪屏页

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