目录

  • Android应用启动白屏问题解决办法
    • 白屏问题的由来
    • 解决方案
    • 文末有言

Android应用启动白屏问题解决办法

白屏问题是应用启动过程中普遍存在的问题。
本文将介绍白屏问题的由来以及一种作者认为是市场上比较普遍的解决办法。

白屏问题的由来

我们已知当系统启动并启动App时需要消耗一定的时间,就算只有1s,也会让用户感觉有“延迟”现象。

我们在项目的MyApplication中模拟一个1s的耗时

class MyApplication : Application() {override fun onCreate() {super.onCreate()Thread.sleep(1000)}
}

来看效果

这是Google设计者为了让用户体会到点击图标后立马就有响应,而让App创建的过程中先展示一个空白窗口。

正是这个设计,我们在点击App应用图标之后,会看到一段时间的空白屏幕,这就是所谓的安卓应用启动白屏。

总结就是:

谷歌设计App启动的时候有一个预览的界面,在应用完成启动初始化之前都会显示这个预览界面,目的是为了让用户点击APP图标的时候有一个瞬间响应的交互体验。

而这个预览界面是由我们app应用主题android:theme中的android:windowBackground属性决定的,当我们不指定的时候android:windowBackground的时候默认是一个近乎白色的颜色#fffafafa

来做一个代码跟踪

android:theme="@style/Theme.WhiteScreen"查看应用主题----><style name="Theme.WhiteScreen" parent="Theme.MaterialComponents.DayNight.DarkActionBar">...
</style>查看父主题----><style name="Theme.MaterialComponents.DayNight.DarkActionBar" parent="Theme.MaterialComponents.Light.DarkActionBar"/>一直跟踪到----><style name="Platform.AppCompat.Light" parent="android:Theme.Holo.Light">...<item name="android:windowBackground">@color/background_material_light</item>
</style>----><color name="background_material_light">@color/material_grey_50</color>----><color name="material_grey_50">#fffafafa</color>

我们看到android:windowBackground属性最终在Platform.AppCompat.Light主题中指定,而background_material_light对应的颜色正是#fffafafa

所以默认情况下,我们点击应用图标,在应用完成启动初始化之前,看到的都是一个白色空白的屏幕。应用的启动时间越长,这个白屏的显示时间也就越长。

我们在MyApplication中做一个耗时操作模拟应用启动初始化

class MyApplication : Application() {override fun onCreate() {super.onCreate()Thread.sleep(3000)}
}

再来看效果,可以发现这时候白屏问题的解决就刻不容缓了。

解决方案

windowDisablePreview和windowIsTranslucent标签

谷歌虽然在主题中有提供如windowDisablePreviewwindowIsTranslucent等标签,用来供用户设置不显示预览窗口 或 者将预览窗口设置为透明 这样两种功能,从视觉上让用户无法看出黑白屏,但实际上这两个标签更像是为了提供给开发者有这个选择权利而提供的标签,并不建议使用。

<!-- Base application theme. --><style name="Theme.WhiteScreen" parent="Theme.MaterialComponents.DayNight.DarkActionBar">...<!--设置系统的取消预览(空白窗口)为true --><item name="android:windowDisablePreview">true</item><!--设置背景为透明--><item name="android:windowIsTranslucent">true</item></style>

我们维持3s的延迟,然后将主题中的windowDisablePreviewwindowIsTranslucent设置为true后查看效果

我们看到点击应用图标后,App会卡顿在那里,等待App启动加载完成后再显示第一个活动窗口。

这显然是和Google官方的设计理念背道而驰的。

正确的解决方法一定是顺着Google设计思想走,也就是让用户点击应用图标的时候有一个及时的响应交互。

改变android:windowBackground属性,替换默认空白预览页面。

当我们替换android:windowBackground属性的值为我们应用自定义的页面。用户点击图标在等待应用初始化加载的过程中,看到的不再是一个空白页,而是一个与本应用相关的图片,这样就完美解决了应用创建过程中看到白屏的问题。其实这也正是市面上很普遍的解决方式。

在与Splash页面做衔接的时候我们有两种选择
1、预览页与Splash页面相同,Splash页面显示完成后直接跳到主页面。
2、预览页与Splash页面不同,先展示预览页,再展示Splash页面,最后再跳到主页面。

第一种,只要做到预览页和Splash页面显示效果完全相同,注意好适配即可,这里就不做详细描述了,感兴趣的朋友可以直接下载Demo查看,我们直接来看效果。

Splash的标题栏也懒得去了,大家明白意思就行。

我们主要看一下比较常见的第二种选择,因为在实际的业务需求中,我们可能会在Splash页面做一下页面定制,如插播广告等。这个时候就要求预览页与我们的闪屏页不同,如何做呢,也很简单。

1、自定义继承自AppTheme的主题

<!-1:自定义主题--><style name="LauncherTheme" parent="Theme.WhiteScreen"><item name="android:windowBackground">@drawable/layout_launcher</item></style>

2、将启动Activity的theme设置为自定义的主题

<activityandroid:name=".SplashActivity"android:theme="@style/LauncherTheme"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity>

3、在启动Activity的onCreate方法中,在super.onCreatesetContentView方法之前调用setTheme方法,将主题设置为最初的AppTheme

class SplashActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {// 注意这里将主题设置回应用的原有主题setTheme(R.style.Theme_WhiteScreen)super.onCreate(savedInstanceState)setContentView(R.layout.activity_splash)thread {Thread.sleep(1000)runOnUiThread(Runnable {startActivity(Intent(this, MainActivity::class.java))})}}override fun onPause() {super.onPause()finish()}
}

查看效果

这个效果图在Spash页会看到残影,这是录屏工具导致的,项目实际运行效果是看不到这个残影的。

值得一提的是,最后这两个效果,我们在MyApplication和SplashActivity中都是设置了延时的,现在你还能感觉到一丝丝的启动白屏吗?

文末有言

本篇文章的正文内容到这里就结束了。要知道的是我们做的仅仅是从视觉方面消除了白屏问题,并没有实际缩短应用的启动时间,想做出一个优秀的App,启动优化必须从有效缩短应用启动时间入手。

我们可以点开淘宝App看一下,粗略估计启动时间1s多。如果你觉得自己开发的应用没有淘宝那么复杂,启动时间达到了3s甚至4s,那就是时候考虑真正地在启动优化方面下点功夫了。

异步初始化,懒加载等都是我们值得借鉴和深入学习的技术。


文中Demo下载地址。

本系列文章引导页点击这里

Android应用启动白屏问题解决办法相关推荐

  1. Android APP启动白屏的解决办法

    平时发现自己写的APP,启动后总有几秒的白屏,很恶心,所以下决心改一下! 下面这个是全局的的Style <style name="AppTheme" parent=" ...

  2. android app启动白屏优化

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wuliang756071448/article/details/74067058 可以看到启动的时候 ...

  3. Android app启动白屏优化

    可以看到启动的时候会有一个白屏, 如果手机较慢的话, 这个白屏就会持续一段时间, 不太友好. 那么还有没有什么办法优化呢? 给我们的应用窗口弄一个PlaceHolder Android最新的Mater ...

  4. android白屏优化方案,优化Android App启动白屏

    问题描述 随着Android App开发时间越来越长,项目中的功能,以及用到的第三方库也越来越多,apk的体积也会越来越大.用户在打开应用时,白屏的时间也越来越长,带来了不好的使用体验,如何才能做到 ...

  5. Android app启动白屏适配方案

    至于app启动时候为什么会白屏,咱们不多赘述,相关的文章以及启动时间优化文章多了去了.咱们这里主要讲述优化完成后如何解决白屏问题. app启动时候黑屏或者白屏是还没加载到布局文件,就已经显示了wind ...

  6. Android应用启动白屏处理

    信大家一定遇到过某些App在手机桌面打开时会出现短暂或者几秒钟的白屏情况吧,没错那是应用程序启动后系统默认的背景色,此时应用的第一个Activity还未被加载出来,所以不管怎么设置第一个Activit ...

  7. laravel项目白屏问题解决办法及原因

    本篇文章主要讲解laravel项目白屏问题的解决办法和原因 日期:2022年3月3日 作者:任聪聪 主要现象 打开主页显示即是白色的,没有任何的代码. 但是将index.php中的内容修改,可以输出e ...

  8. mPaas苹果客户端离线包引入http的js白屏问题解决办法

    今天体验了一下回归原点. 体验了什么叫不留遗憾. 1.实现现象:当html代码中有<script type="text/javascript" src="http: ...

  9. android app启动失败,Android应用App启动白屏(黑屏)问题解决

    Android应用App启动白屏(黑屏)问题解决 点击Android手机桌面的应用App icon图标后,Android启动这个应用,正常情况下会立即看到并进入到开发者自己写在MainActivity ...

  10. Android应用App启动白屏(黑屏)问题解决

    Android应用App启动白屏(黑屏)问题解决 点击Android手机桌面的应用App icon图标后,Android启动这个应用,正常情况下会立即看到并进入到开发者自己写在MainActivity ...

最新文章

  1. 【原创】有关Silverlight中“DataGrid中级联动态绑定父/子ComboBox ”的示例。
  2. SpringBoot设置首页(默认页)跳转
  3. MySQL抽稀_python安装mysql的依赖包mysql-python操作
  4. 集群式游戏服务器架构方案设计开发
  5. linux编译生成GUI程序命令,linux – 快速开发GUI命令行
  6. MATLAB2017b libsvm安装教程
  7. C++实现Rhino中画准均匀B样条曲线功能
  8. MarkDown的下载、安装和基础使用
  9. addr2line排查地址
  10. 数字逻辑——七段数码管
  11. sql自定义报表软件_SQL Server中的报表–自定义报表的外观
  12. 如何进入Github【亲测有效】
  13. BUUCTF [0CTF 2016] piapiapia
  14. 实战攻防之紫队视角下的实战攻防演习组织
  15. python批量添加姓名生成奖状批量处理图片教师学生奖状
  16. windows server ----域(D)的创建
  17. 小程序父传子组件传值
  18. 斯诺登评苹果Face ID:我更担心隐私安全
  19. java运算符(算数运算符、三目运算符、位运算符)
  20. vb.net 文本转语音

热门文章

  1. 小程序和服务器之间的通信,微信小程序建立服务器通信的方法
  2. 一筐鸡蛋c语言编程,求答案-求答案?一筐鸡蛋?求答案?一筐鸡蛋:1个1个拿,正好拿完2个2 爱问知识人...
  3. java实现商品的分类_Spring 商品分类
  4. 微信直播王者荣耀设置教程(微信教程)
  5. 数学分析(1):集合相关公式的证明
  6. java编程基础总结——20.foreach遍历及lambda表达式
  7. 库卡profinet通讯中文说明书
  8. 5000头奶牛的数字化之旅
  9. 计算机窗口的基本组成部分组成部分,windows7窗口的主要组成部分有哪些
  10. 嵌入式系统课程大作业设计报告