Android开发冷启动解决方案 实现秒开

简介:

前言

关于 splash 页面相信每个Android开发者都是非常熟悉的,而且很多人也遇到过需要在splash加个广告图片,然后延迟3秒在进入主页面,splash 应该只是一个启动页面,不应该放广告,但是那又能怎么样呢?又敌不过产品经理。
大多数情况下都会碰到启动白屏和黑屏的情况,那么本文将探讨几种我在开发中用到的几种解决方案。

原理解析

冷启动

什么是冷启动

Android中的冷启动,使用直白的话就是:

 ●   当手机 重启 ,点击桌面图标启动应用的过程就是冷启动

 ●  未启动手机,长时 未使用,应用被 kill 后,此时点击桌面图标启动应用的过程

冷启动的表现形式

未做处理的情况

 ●   点击桌面图标后没有反应,没有瞬间打开应用,也就是没有马上看到应用打开
 ●   点击桌面图标后会显示 黑屏 或者 白屏 , 没有及时渲染出页面元素

详情可以查看下图:

f56010aa1b4f259cbc33101fed262e569dd17992

从上图可以看出,点击图标后出现了短暂的白屏,然后才显示了 splash 页面的内容,在splash页面进行了延迟 1500毫秒再跳转到主页面。虽然白屏的时间很短暂,但给用户的体验感就不是很好了。

冷启动产生的原因

冷启动产生的主要原因要从APP的启动流程说起:

1.用户点击 icon
2.系统开始加载和启动应用
3.应用启动:开启空白(黑色)窗口
4.创建应用进程
5.初始化Application
6.启动 UI 线程
7.创建第一个 Activity
8.解析(Inflater)和加载内容视图
9.布局(Layout)
10.绘制(Draw)

下图是启动的日志信息:

2e384902952035c44aa2a6d5b32151a7893111c6

从上面可以看出,从应用启动到布局和绘制,是需要时间的,这也是无法避免的,越是低端的手机上,这一过程耗费的时间。 解决方案

首先要明确的一点就是:冷启动无法避免,我们只能去减少冷启动的时间和适配冷启动。

如何减少冷启动的时间?

其实这个问题等同于如何减少应用初始化的时间,从上面的APP启动流程中,如果我们在应用初始化的操作越多,那么从初始化到绘制的时间越长,用户看到真实界面的时间也就越长,可以从如下几个方面进行:

1.减少在 Application 中的耗时操作(懒加载)
2.减少在 onCreate 的耗时操作

如何适配冷启动?

Android 为我们提供了 android:windowBackground 的解决方案,我们可以专门为 SplashActivity 设置一个背景来避免 创建空白(黑色) 窗口这一步骤的尴尬,而对于 android:windowBackground 又延伸了各种各样的方案。

1. 纯色背景 + 启动图标

这种做法在国产APP上面少见,在国外的APP常见,简单的来说就是用 layer-list 绘制一个纯色的背景加上一个启动图标,layer-list 代码如下:


<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<item android:drawable="@color/colorPrimary" />

<item>
<bitmap
android:gravity="center"
android:src="@mipmap/ic_launcher" />
</item>

</layer-list>

然后我们为SplashActivity创建一个主题:


<resources>
<!-- 基本主题 -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>

<!--纯色加启动图标的方案-->
<style name="SplashThemeLayer" parent="AppTheme">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowBackground">@drawable/bg_splash_layer_list</item>
</style>
</resources>

最后为 SplashActivity设置主题为 SplashThemeLayer 在启动看看效果吧。

36473feb4ff8aa71b292315a66da29ccf81b316e

是不是实现了想要的效果?点击应用图标立即显示了我们的图标。

关于layer-list我们还可以拓展一下:例如加一个45°的线性渐变.


<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<item>
<shape android:shape="rectangle">
<gradient
android:angle="45"
android:endColor="@color/colorPrimary"
android:startColor="@color/colorAccent" />
</shape>

</item>

<item>
<bitmap
android:gravity="center"
android:src="@mipmap/ic_launcher" />
</item>

</layer-list>

看看效果:

89b11abf62ca3c7f3b3b0ff475ec8c8c3eca9fc1

实现是有点丑,但是哪有怎么样呢?

2. 使用背景图片

前面的第一种方式是使用纯色背景 + 启动图标,这种方式肯定是不满足我们的产品经理的,他们要的是 个性化 的页面。
使用背景图片也是很简单的,只需要在them将我们之前的drawable替换成我们的图片即可:


<!--使用图片的方案-->
<style name="SplashThemeImage" parent="AppTheme">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowBackground">@mipmap/icon_splish</item>
<!--沉浸-->
<item name="android:windowTranslucentStatus">true</item>
</style>

需要注意的是:Splash页面的背景颜色需要设置为透明 #00000000,不要设置其他背景,否则会导致图片的伸缩变形。

看看启动效果吧:

45c169a56ca74326beff0339ffb6716b19be7d26

从效果图可以看到,已经得到了我们平常想要的效果了,但是用这种方式又带了了另外一个问题:
图片的内存占用和OOM,像这种启动页面的,基本上都是直接打包在APP中的,而色彩越是丰富,图片的体积就越大,大多数情况下我们是无法反驳的,我们可以通过压缩图片的方式来尽量减少图片的体积,这里推荐一个png压缩网站:https://tinypng.com/,基本上能把我们拿到的设计图减少一半以上的体积。
3. 说服产品,使用更酷炫的方式来实现吧!

你可以这样:

9990b78a320030a085e93cd187b023907391df88

还可以这样:

e1b37327def132c85d3005910ed7438535f9db18

由于这不是我做的,所以就不放源码了,自己去原作者哪里看吧https://github.com/saulmm/onboarding-examples-android

题外:关于热启动

什么是热启动

 ●   用户按下 Home 键返回桌面后又马上点击桌面图标启动应用(Application 仍然存活)

 ●  应用未完全被杀死,从 启动列表 中进入到应用(Application 仍然存活)

热启动表现形式

4ef37e52c780bdc490fb01430d065db2abd63a79

从图中我们演示了三种操作:

 ●   点击 Home 键返回桌面,点击icon进入应用
 ●   点击 Home 键返回桌面,从任务列表进入应用
 ●   点击回退键退出应用,点击icon进入应用

以上三个操作都是十分的流畅,没有丝毫的延迟,没有出现白屏和黑屏的情况。

总结

关于如何进行冷启动的适配,三种方式,就看个人如何去抉择了。解决问题的方式有很多,实在不行就解决提出问题的人吧,从根源上解决问题所在。


原文发布时间为:2018-09-17

本文作者:aohanyao

本文来自云栖社区合作伙伴“安卓巴士Android开发者门户”,了解相关信息可以关注“安卓巴士Android开发者门户”。

相关文章
|
8月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1432 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
8月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1018 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
8月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1120 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
9月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
883 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
8月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
391 0
|
9月前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
1181 6
|
11月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
664 11
|
11月前
|
移动开发 Java 编译器
Kotlin与Jetpack Compose:Android开发生态的演进与架构思考
本文从资深Android工程师视角深入分析Kotlin与Jetpack Compose在Android系统中的技术定位。Kotlin通过空安全、协程等特性解决了Java在移动开发中的痛点,成为Android官方首选语言。Jetpack Compose则引入声明式UI范式,通过重组机制实现高效UI更新。两者结合不仅提升开发效率,更为跨平台战略和现代架构模式提供技术基础,代表了Android开发生态的根本性演进。
446 0
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
482 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
10274 2

热门文章

最新文章