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

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

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


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

闪屏

闪屏页是什么?

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

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

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

在这里插入图片描述
在这里插入图片描述

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

这是 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性能》持续更新中……

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/234007.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Executors和ThreadPoolExecutor学习整理

    任务的执行与线程池(上) https://mp.weixin.qq.com/s/p3JZERyZXnF8jR_3KKIGJA 任务的执行与线程池(下) https://mp.weixin.qq.com/s/iUAaVXIB8rCzP_GeDhIlqAjava并发编程–Executor 框架 https://www.cnblogs.com/MOBIN/p/5436482.html线程…

    2022年2月27日
    34
  • 使用python快速开发桌面小工具

    使用python快速开发桌面小工具参考链接WelcometoPython.orgExtendingandEmbeddingthePythonInterpreter—Python3.7.3documentation起因更重要在日常开发中,总需要一些普通的小工具。小工具嘛,要得急,写得也急,总有很多不完善的问题,频繁修改成了一个较大的问题。比如之前用c#写了一个将excel表自动转成csv文本的工具,…

    2022年5月20日
    45
  • java 判断一个对象是否为空对象

    java 判断一个对象是否为空对象最近项目中遇到一个问题,在用户没填数据的时候,我们需要接收从前端传过来的对象为null,但是前端说他们一个一个判断特别麻烦,只能传个空对象过来,我第一个想法就是可以通过反射来判断对象是否为空。第一版:User.javapublicclassUser{privateStringusername;privateBooleanactive;priva…

    2022年6月5日
    37
  • matlab空间计量AIC准则,关于AIC准则

    matlab空间计量AIC准则,关于AIC准则AIC准则提出背景计量经济学研究对象:量化的社会经济问题研究目的:利用已有信息,通过模型发现内在机理,并对未知信息作出统计推断核心问题:保证模型反映数据所代表的主要信息,降低噪声干扰项的影响,保证模型的预测准确性模型包含的信息量能否尽可能大?不能。一是干扰信息无法避免;二是若模型包含了全部信息,则模型的复杂度也会相应提高,相应地会提高经济学成本;三是人无法对模型的准确性做出客观而科学的评断。信息论…

    2022年5月10日
    32
  • Qt学习—qt编写定时关机程序

    Qt学习—qt编写定时关机程序编写了一个简单的定时关机程序,软件界面如下。顺便记录一下所用的控件的一些简单的使用方法。程序中用到的控件主要是QLCDNumber(数码管控件)以及QSpinBox()(滚动框控件)。通过system()调用系统的关机命令。需要包含头文件stdlib.h。此外涉及到数码管以及滚动框显示数字时,前缀“0”的显示和消隐的问题。以下是代码。首先是main.cpp#include

    2022年7月22日
    28
  • git fetch 更新远程代码到本地仓库

    git fetch 更新远程代码到本地仓库

    2021年11月8日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号