前言

Android系统上,当启动应用时存在闪白屏或者黑屏,这种问题很常见。

产生原因:

当系统启动一个APP时,zygote进程会首先创建一个新的进程去运行这个APP,但是进程的创建是需要时间的,在创建完成之前,界面是呈现假死状态的,因为用户会以为没有点到APP而再次点击,这极大的降低用户体验,Android需要及时做出反馈去避免这段迷之尴尬。于是,Android系统根据你的AndroidManifest文件设置的主题颜色的不同来展示一个白屏或者黑屏。

而这个黑(白)屏正式的称呼应该是Preview Window,即预览窗口。

总结

三种方式都可以解决闪黑屏或白屏问题,但各有优点和缺点。

  1. 设置android:windowBackground,我的应用不存在启动logo,因此这个对我的应用不行。
  2. 设置android:windowIsTranslucent,除了存在卡几秒响应,还会导致其他交互的Activity的生命周期异常,由于部分逻辑依赖Activity周期,因此对于我的应用不行。
  3. 设置android:windowDisablePreview 开历史倒车,存在卡顿几秒,这个是目前三个方式中比较合适的(相比而言)

由于使用场景不一,采用的方式不用,这个自己舍取。

正文

根据自己经验和网上网友整理,下面我们说说存在的解决方式。

windowBackground

这个是设置主题样式窗口的背景图,如下

    <style name="media_default_theme" parent="@android:style/Theme.NoTitleBar.Fullscreen">
        <item name="android:windowIsTranslucent">false</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@drawable/default_bg</item>
    </style>

设置一张窗口的背景图,会让用户感觉非常快。

优点: 可以解决闪黑屏和白屏问题,同时让人觉得启动快。

缺点:如果不允许设置启动窗口背景就麻烦了(勉强算一个缺点)

windowIsTranslucent

这个是设置窗口为透明窗口

    <style name="media_default_theme" parent="@android:style/Theme.NoTitleBar.Fullscreen">
		<item name="android:windowIsTranslucent">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowNoTitle">true</item>
    </style>

这样也可以解决黑屏或白屏问题。

优点: 可以解决闪黑屏和白屏问题

缺点: (1)点击后,响应慢了一点,让人觉得启动卡顿(2)会导致切换时其他Activity生命周期异常

会导致切换时其他Activity生命周期异常

上面说了,透明窗口会导致启动的Activity的周期异常。

A Activity : 主题没有透明属性

B Activity : 主题带有透明属性

先启动A Activity,然后启动B Activity,可以通过B Activity启动(或者其他方式)启动A Activity。

下面是A Activity生命周期的打印日志:

  onNewIntent :
  onResume :
  onPause:
  onResume:

上面可以看出,onResume启动了两次,所以如果项目中有依赖生命周期的功能话就存在一定的问题。

windowDisablePreview

这个属性就是禁止窗口预览动画,就是开历史倒车。

    <style name="media_default_theme" parent="@android:style/Theme.NoTitleBar.Fullscreen">
		<item name="android:windowDisablePreview">true</item>
    </style>

优点: 可以借闪黑屏和白屏问题

缺点:点击后,响应慢了一点,让人觉得启动卡顿。

参考文章

  1. Android启动页黑屏及最优解决方案
  2. 解决启动Android应用程序时出现白屏或者黑屏的问题

 历史上的今天

  1. 2024: Android刷新媒体库的方法(0条评论)
  2. 2024: AudioTrack简单使用(1条评论)
  3. 2023: Android截图命令介绍(0条评论)
  4. 2022: 视频播放中,拖动进度条可以seek到相应视频帧(0条评论)
  5. 2018: Looper中ThreadLocal的简介(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

济慈:夜莺颂

我的心在痛,困顿和麻木刺进了感官,有如饮过毒鸠,又象是刚刚把鸦片吞服,于是向着列斯忘川下沉:并不是我嫉妒你的好运,而是你的快乐使我太欢欣——因为在林间嘹亮的天地里,你呵,轻翅的仙灵,你躲进山毛榉的葱绿和荫影,放开歌喉,歌唱着夏季。 哎,要是有一口酒!那冷藏在地下多年...

舒婷:致橡树

我如果爱你——绝不像攀援的凌霄花,借你的高枝炫耀自己;我如果爱你——绝不学痴情的鸟儿,为绿荫重复单调的歌曲;也不止像泉源,常年送来清凉的慰藉;也不止像险峰,增加你的高度,衬托你的威仪。甚至日光,甚至春雨。不,这些都还不够!我必须是你近旁的一株木棉,作为树的形象和你站在一起...

[摘]Android IO流读写文件实例

继前文摘抄,此篇是Android IO读写的实例操作。案例0功能:1、创建文件夹、文件 2、遍历文件夹下面的所有文件public class Test1 {      public static void main(String[] args) {          // TOD...

穆旦:古墙

一团灰沙卷起一阵秋风,奔旋地泻下了剥落的古墙,一道晚霞斜挂在西天上,古墙的高处映满了残红。 古墙寂静地弓着残老的腰,驼着悠久的岁月望着前面。一只手臂蜿蜒到百里远,败落地守着暮年的寂寥。 凸凹的砖骨镌着一脸严肃,默默地俯视着广阔的平原;古代的楼阁吞满了荒凉,...

MySQL中like查询的简单使用

前言在数据库中,like关键字用于搜索匹配字段中的指定内容。本文就摘抄于网上的内容,整理于此,方便自己查阅。正文like语法[not] like '字符串'not:可选参数,字段中的内容与指定字符串不匹配时满足条件字符串 :指定用来匹配的字符串,可以是完整的字符串(完整匹配),也...

[摘]Android判断顶部Activity的包名等

前言本文摘抄,具体来源看末尾连接,记录于此。好记性不如烂笔头。小结在实际中,发现使用[获取顶层Activity]的第一个方式存在问题,偶尔获取的顶层activity是错误的。正文判断当前是不是桌面 public static boolean isHome(Context con...