1、为什么 APP 启动时会出现白屏或者黑屏?

当打开一个 Activity 时,如果这个 Activity 所属的应用还没有在运行,系统会为这个 Activity 所属的应用创建一个进程,但进程的创建与初始化都需要时间,在这个动作完成之前系统要做什么呢?如果没有任何反应的话,如果程序初始化的时间很长,用户可能还以为没有点到相应的位置。但此时所启动的程序还没初始化完,既无法显示程序,又不能停在原处不做任何动作,怎么办?这就有了Starting Window的概念,也可以称之为Preview Window

Starting Window 就是一个用于在应用程序进程创建并初始化成功前显示的临时窗口,拥有的 Window Type 是TYPE_APPLICATION_STARTING。在程序初始化完成前显示这个窗口,以告知用户系统已经知道了他要打开这个应用并做出了响应,当程序初始化完成后显示用户 UI 并移除这个窗口。

显示白屏或者黑屏,是由你的启动 Activity 或者 Application 来决定的。如果你使用的是 Light 主题,那么就可能出现白屏;如果你使用的是 Black 主题,那么就可能出现黑屏。当你设置 Light 或者 Black 主题时,Starting Window 显示的就是你启动 Activity 的 android:windowBackground 属性,所以才会出现白屏或者黑屏的情况。

2、怎么解决启动白屏或者黑屏问题呢?

在 style.xml 文件中为启动的 Activity 设置主题,设置 android:windowBackground 属性为启动 Activity 显示的闪屏图片,这样才有 APP 秒开的效果。设置 android:windowFullscreen 属性为 true,使闪屏图片全屏显示。设置 windowNoTitle 属性为 true,隐藏 Activity 的 ActionBar 显示。

     <!-- 防止欢迎页白屏或者黑屏,设置图片 -->
<style name="SplashTheme" parent="AppBaseTheme">
<item name="android:windowBackground">@drawable/img_welcome</item>
<item name="android:windowFullscreen">true</item>
<item name="windowNoTitle">true</item>
<!--<item name="android:windowIsTranslucent">false</item>-->
<!--<item name="android:windowDisablePreview">true</item>-->
</style>

然后,在清单文件 AndroidManifest.xml 中,为启动的 Activity 设置主题 SplashTheme。

     <activity
android:name=".ui.WelcomeActivity"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

此外,如果设置 android:windowIsTranslucent 属性,表明该窗口是半透明的,这样也不会出现白屏或者黑屏。但是,它和 MainActivity 的显示是同步,如果在 MainActivity 启动的时候,有过多复杂的操作,就会出现在手机中点击了应用程序的图标之后,但过两秒才会打开应用程序不好的卡顿体验效果。

如果设置 android:windowDisablePreview 属性,禁用窗口的预览动画, 在 MainActivity 显示之前,系统永远不会使用窗口的主题来显示它的预览,这也保证了不会出现白屏或者黑屏。但是,与设置 android:windowIsTranslucent 属性一样,如果在 MainActivity 启动的时候,有过多复杂的操作,就会出现在手机中点击了应用程序的图标,但过两秒才会打开应用程序不好的卡顿体验效果。

3、还有没有其他解决方案?

以上方式可以实现 APP 秒开,但是我不想显示一张图片,那么你也可以显示纯颜色,或者纯颜色加小图标。

Starting Window 显示纯颜色,直接设置 android:windowBackground 属性为颜色代码:

     <item name="android:windowBackground">@color/colorAccent</item>

Starting Window 显示纯颜色加图标,需要在 Drawable 中定义一个 splash.xml 文件:

     <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 背景颜色 -->
<item android:drawable="@color/green" />
<item>
<!-- 图片 -->
<bitmap
android:gravity="center"
android:src="@drawable/icon_welcome" />
</item>
</layer-list>

转载自:http://sendtion.cn/archives/506


Android app启动是出现白屏或者黑屏如何解决?的更多相关文章

  1. Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法(转)

    转载: Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法   首先感谢博主分享,本文作为学习记录 惊鸿一瞥 微信的启动页,相信大家都不陌生. 不知道大家有没有发现一个现象 ...

  2. Android项目实战(四十二):启动页优化,去除短暂白屏或黑屏

    大家会发现一个空项目,从手机桌面打开app是秒启动.但是对于自己开发的项目,有时会发现打开app的时候,会有短暂的1秒--2秒的白屏或者黑屏,然后才进入到程序界面. 个人理解为我们自己实现的Appli ...

  3. [FMX] Android APP 启动黑屏优化补丁

    使用说明 *************************************************** Android APP 启动黑屏优化补丁 作者: Swish, YangYxd 201 ...

  4. Android------第一次启动出现白屏或者黑屏

    APP开发中,第一次运行启动app时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示. 当打开一个Activity时,如果这个Activity所属Application还没有在运行, 系统 ...

  5. Angular+ionic2 web端 启动程序出现短暂 白屏或黑屏 的处理小妙招

    在ionic2项目启动是会出现短暂的白屏或者黑屏,虽然很短,但是用户体验不太好.上网查了相关的资料,都是针对打包APP的解决办法,针对浏览器端使用的项目没有效果,所以自己写了样式,巧妙的避开这个问题, ...

  6. Android app启动activity并调用onCreate()方法时都默默地干了什么?

    Android app启动activity并调用onCreate() 方法时都默默地干了什么?   在AndroidManifest.xml文件中的<intent-filter>元素中有这 ...

  7. android app启动就闪退怎么办?

    开发过程中,如遇到android app启动就闪退,不要急,直接进入调试模式运行app,就会取得出错的原因. http://blog.sina.com.cn/s/blog_44fa172f0102wg ...

  8. Unity 登录白屏或者黑屏

    如果有一天,突然,你的Unity抽风了,登录界面白屏或者黑屏,不要急着重装.我重装了3次,第四次我再也忍不住了,终于出手了. 找到 C:\Users\hasee\AppData\Roaming\Uni ...

  9. Android开发之解决APP启动白屏或者黑屏闪现的问题

    在做搜芽的过程中,发现那个外包人缘做的不行,由于启动的时候会停顿,然后白屏一会,联想到几个月前我在我的三僚企业通信软件里面拉起9K-Mail的时候也会黑屏,所以决定学习一下.解决一下.这不,万能的网络 ...

随机推荐

  1. 9、如何在Xamarin中进行iOS真机调试和发布

    本文主要引导用户如何使用真机调试和编译发布. 概述 使用前的准备: 1.一台IPhone设备  或者IPad 都行看你自己 2.一台Mac主机和搭建好对应的xamarin.ios 开发环境 3.开发者 ...

  2. Java之集合(六)PriorityQueue

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7299233.html 1.前言 本章介绍队列中的PriorityQueue--优先队列,顾名思义,这是一个可以指 ...

  3. 利用wget配合bash脚本同时下载多个文件

    先把需要下载的文件写入到一个文件中,命名为urls.txt,比如: http://blog.is36.com/a.jpg http://blog.is36.com/b.jpg http://blog. ...

  4. Filter应用之-自动登录

    自动登录,是为了帮助用户多次使用这个网页时,不用再次输入用户名和密码就可以登录. 是指用户将用户的登录信息,人,保存到本地的文件中Cookie中. Name,value – 声明时 new Cooki ...

  5. Vue中使用children实现路由的嵌套

    Vue中使用children实现路由的嵌套 相关Html: <!DOCTYPE html> <html lang="en"> <head> &l ...

  6. CSS3中的pointer-events

    今天做项目中偶然误把元素加上了pointer-events属性,结果导致后来在js中给该元素加点击事件不能用,检查了半天才发现是这个属性的问题.之前没有好好研究,于是决定仔细研究一下. 一.定义及语法 ...

  7. SPSS学习系列之SPSS Modeler怎么修改默认的内存大小(图文详解)

    不多说,直接上干货! 问题来源: 如果你的电脑内存配置比较低的话,会随着数据量增加(尤其是大数据),带不起的情况很有可能发生,会出现一些内存报错... ... 解决办法: 打开“工具”,在modele ...

  8. ELK日志系统之使用Rsyslog快速方便的收集Nginx日志

    常规的日志收集方案中Client端都需要额外安装一个Agent来收集日志,例如logstash.filebeat等,额外的程序也就意味着环境的复杂,资源的占用,有没有一种方式是不需要额外安装程序就能实 ...

  9. Nodejs学习笔记(七)—Node.js + Express 构建网站简单示例

    前言 上一篇学习了一些构建网站会用到的一些知识点:https://www.cnblogs.com/flyingeagle/p/9192936.html 这一篇主要结合前面讲到的知识,去构建一个较为完整 ...

  10. Mongodb添加副本及修改优先级

    Mongodb添加副本及修改优先级 1.添加副本集 #在primary节点上执行 >rs.add( { host: "192.168.1.11:27017", priorit ...