Android启动性能优化——闪屏及Splash页


本文我们将分析如何使用系统闪屏和 Splash 页来提升 APP 的启动性能。

闪屏

闪屏页是什么?

启动闪屏不仅仅可以作为品牌宣传页,还能够减轻用户对启动耗时的感知,但是如果使用不恰当,将适得其反。当点击桌面图标启动 APP 的时候,程序会显示一个启动窗口,一直到页面的渲染加载完毕。如果程序的启动速度足够快,我们看的闪屏窗口停留显示的时间则会很短,但是当程序启动速度偏慢的时候,这个启动闪屏可以一定程度上减轻用户等待的焦虑感,避免用户过于轻易的关闭应用。

通常,大多数开发者都会通过设置启动窗口主题的方式来替换系统默认的启动窗口,通过这种方式只是使用“障眼法”弱化了用户对启动时间的感知,但本质上并没有对启动速度做什么优化。也有些 APP 通过关闭启动窗口属性 android:windowDisablePreview 的方式来直接移除系统默认的启动窗口,但是这样的弊端是用户从点击桌面图标到真的看到实际页面的这段时间当中,画面没有任何变化,这样的用户体验是十分糟糕的!

启动页 Activity 展示时,系统默认启动窗口的展示就会消失。

Android 闪屏页布局 闪屏页是什么_android


Android 闪屏页布局 闪屏页是什么_android_02

为什么会有系统默认启动窗口?

这是 Android 为了提升用户体验的一个优化,让用户在真正Activity启动之前首先看到一个画面展示,不至于让用户觉得点击了桌面 Icon 后,APP 没有反应了。

注意:我们启动应用时,都会展示一个 Splash 闪屏页,这个闪屏页不同于上面所说的系统默认的启动窗口,我们自定义的 Splash 闪屏页通常会展示我们的 logo 或者一些广告。

设置自定义闪屏页

设置自定义的闪屏页可以提高我们启动的“视觉速速”。这里,我们通过添加一个自定义图片,通常会设置一个背景,然后把 logo 居中显示,可以使用 xml 文件来布局(注意,该图片不可展示动画,并且展示时间也不可控)。这种方式可以给用户一种启动非常快的感觉,并且展示了平牌 logo 也有助于提升品牌认知。

对于启动闪屏,正确的使用方法是自定义一张图片,把这张图片通过设置主题的方式显示为启动闪屏。

布局 XML 文件:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">
      <!-- The background color, preferably the same as your normal theme -->
      <item android:drawable="@android:color/white"/>
      <!-- Your product logo - 144dp color version of your app icon -->
      <item>
        <bitmap
          android:src="@drawable/product_logo_144dp"
          android:gravity="center"/>
      </item>
    </layer-list>

清单文件:

<activity ...
    android:theme="@style/AppTheme.Launcher" />

代码执行到主页面的onCreate的时候设置为程序正常的主题,这样就切回到正常主题背景了。

public class MyMainActivity extends AppCompatActivity {
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        // Make sure this is before calling super.onCreate
        setTheme(R.style.Theme_MyApp);
        super.onCreate(savedInstanceState);
        // ...
      }
    }

如上,最简单的方式是先调用 setTheme(R.style.AppTheme),然后再调用 super.onCreate() 和 setContentView()。

Splash 页

系统默认启动窗口之后,通常我们会设置一个 Splash 闪屏页的 Activity 作为启动页 Activity,用于展示广告,时间通常会在1.5s之上,到,4,5秒不等,这段时间我们也可以充分利用起来,为进入主界面的展示做一些准备工作(预处理逻辑、网络加载,框架初始化等)。

这里我们所说的 Splash 页是一个真正的 Activity,而不是系统默认的启动页,但它会紧接着系统的闪屏页显示,所以我们通常需要做一个由系统闪屏页到我们的 Splash 页的一个过渡效果。例如,如果系统默认启动窗口展示的时间非常短,并且和我们的 Splash 也风格差异较大,这样会有闪的感觉,体验不是太好。我们可以在Splash初始时,展示一个和系统默认启动窗口相同的页面,然后通过添加一个过渡动画,过渡到之后广告的展示,这样就完美的解决了视觉上的体验问题了。

目前主流 APP 的 Splash 页面,通常都是展示品牌 logo 或者一些开屏广告或者宣传页。Splash页面通常都比较简单(包括布局、逻辑都非常简单),所以 Splash Activity 创建的速度会非常快,给用户感觉就是“这个 APP 启动很快”的体验。而我们的主页面通常都是整个 APP 业务逻辑和布局最复杂的页面之一了,并且通常都需要网络数据来进行页面内容展示,所以如果我们在系统闪屏页之后,直接显示主页,通常会是一个比较糟糕的体验(APP 打开速度变慢了)。那么我们的主页要如何进行展示呢?我们的 Splash 除了给用户 APP 启动块的感觉和一些广告宣传,还有什么其他作用呢?

其实,几乎所有 APP 都将主页放在 Splash 页面之后展示,这样做的好处有几个:

  1. Splash 页面很轻量,创建和显示速度快,可以让用户觉得我们的“APP 启动快”。
  2. Splash 页面可以进行品牌和广告宣传,提高我们的品牌和广告的收益。
  3. 主页通常在 Splash 页面之后展示,这样我们其实将时间分为了三段:Application 相关处理逻辑、Splash 页面创建及展示、主页处理及显示。这样比直接从 Application 创建到主页显示,给人感觉更快了,因为中间加入了视觉的变化(Splash页),避免了一段更长时间的等待。
  4. 我们可以在Splash页面显示阶段,进行主页的一些预处理准备,比如:对主页所需网络内容进行预取操作、对主页所需本地内容进行提前 IO 操作、对主页所需 SDK 等耗时内容进行预处理。
  5. 主页的预处理会加速主页 Activity 的显示速度,是提高用于启动速度体验的最有效的方式之一。

总结


本文介第一部分,绍了系统闪屏页,以及如何使用闪屏页来提升“启动速度”的体验。第二部分,介绍了 Splash 页,以及如何利用 Splash 页,达到”快速启动“的效果。

关于启动性能,请参考上文《Android启动性能优化——分析篇》。


PS:性能优化专栏:《Android性能》持续更新中……