启动白屏现象

随着应用体积越来越大,初始化的时候做的事情越来越多,应用在启动的时候,往往会出现一个短暂的白屏现象,对于用户来说体验非常不好,如下图所示:

为什么会出现启动白屏?

先做个测试:在MainActivity的onCreate方法中,在调用setContentView设置布局前,让延迟执行2秒中,则会出现白屏现象。

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);try {// 延迟2秒Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}setContentView(R.layout.activity_main);

所以一般出现白屏的原因就是系统在加载布局之前执行了太多的耗时操作,比如:

  • Activity启动过程:当点击桌面图标时,系统进程或fork应用进程,应用进程会做一些初始化操作,加载资源以及创建启动Activity,所以用户不会马上进入应用。当启动一个activity或者应用的时候,系统会先加载一个window preview的UI来增加过渡效果,,在启动页没有绘制完成时,会先初始化一个Window,所以通常看到的黑屏或白屏,就是这个预览窗口。
  • 加载的页面比较复杂,系统绘制到渲染耗时;
  • application中同步初始化过多耗时操作。

初步优化的方式是,将一些初始化操作放到子线程中异步执行,优化加载的页面布局层级,减少布局复杂度。

白屏和黑屏

当启动的时候,有的手机显示的是白屏,而有的手机显示的是黑屏,所以为什么会出现这种情况呢?

打开res/value/styles.xml,找到应用主题样式:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"><!-- Customize your theme here. --><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item>
</style>

AppTheme样式继承parent="Theme.AppCompat.Light.NoActionBar",找到Theme.AppCompat.Light.NoActionBar,如下:

<style name="Platform.AppCompat.Light" parent="android:Theme.Holo.Light">

再找到它的父样式android:Theme.Holo.Light

<style name="Theme.Holo.Light" parent="Theme.Light">

最后再找到Theme.Light

<style name="Theme.Light"><item name="isLightTheme">true</item><!--设置window背景色--><item name="windowBackground">@drawable/screen_background_selector_light</item><item name="windowClipToOutline">false</item><item name="colorBackground">@color/background_light</item>

找到<item name="windowBackground">@drawable/screen_background_selector_light</item>,这句就是window窗口的背景颜色配置,点进@drawable/screen_background_selector_light就可以看到颜色值:

<drawable name="screen_background_light">#ffffffff</drawable>

所以,只要重写一下windowBackground样式就可以设置成你想要的颜色,如设置为黑色:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"><!-- Customize your theme here. --><item name="android:windowBackground">#000000</item>
</style>

启动结果:

解决方法

大部分的app都是使用SplashActivity来避免启动白屏:

1、首先创建一个不带布局文件的SplashActivity,不要调用setContentView方法,另外在SplashActivity中可以增加申请基本访问权限的功能;

public class SplashActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//防止切换后台回来进入启动页面if (!this.isTaskRoot()) {finish();return;}// 使用PermissionX申请权限PermissionX.init(this).permissions(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS,Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE).request(new RequestCallback() {@Overridepublic void onResult(boolean allGranted, List<String> grantedList, List<String> deniedList) {if (allGranted) {toMainActivity();}}});}public void toMainActivity() {Intent intent = new Intent(SplashActivity.this, MainActivity.class);startActivity(intent);finish();}}

2、新增screen.png图片,并在res/value/styles.xml中新增SplashTheme

<!--优化启动白屏-->
<style name="SplashTheme" parent="AppTheme"><!--设置window背景图片--><item name="android:windowBackground">@drawable/screen</item><!--设置不可以在API级别21及更高级别的状态栏下绘制所有内容--><item name="android:windowDrawsSystemBarBackgrounds">false</item><!--设置window全屏--><item name="android:windowFullscreen">true</item><!--设置window无标题栏--><item name="android:windowNoTitle">true</item>
</style>

3、给SplashActivity设置SplashTheme样式,并设为启动页:

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

所以在启动SplashActivity的时候,设置了window的属性,又不用加载布局,从而避免了黑白屏现象。

最终结果:

文中示例源码地址:

GitHub地址

Gitee地址

轻松搞定应用启动黑白屏相关推荐

  1. 录ppt的时候录光标_使用 PowerPoint 轻松搞定 Windows 电脑录屏丨一日一技

    此前给大家介绍过许多 在移动设备上录制屏幕 的方法,却很少提及桌面端的屏幕录制.但实际上在学习和工作中偶尔还是会碰到需要进行桌面端屏幕录制的情况.而近日我无意中发现了一个简便的录制 PC 电脑桌面的方 ...

  2. mac电脑怎么录屏?2招轻松搞定!

    案例:怎样对mac电脑进行屏幕录制? [之前一直使用的是Windows电脑,对Windows电脑比较熟悉.最近换了一台苹果电脑,不知道使用它怎么进行电脑录屏.求一个好用的苹果电脑录屏方法!] 在我们的 ...

  3. linux如何解除密码锁屏图案大全,手机锁屏图案(锁屏密码)忘记了怎么办?四种方法帮你轻松搞定...

    很多朋友可能为了追求新奇,对手机的各种功能都比较好奇,都想试一试.对于图案解锁这个功能也可能比较喜欢,但会不会就是刚刚设置完了就忘记了呢?那么手机锁屏图案(锁屏密码)忘记了怎么办?本文将为大家介绍四种 ...

  4. captura录屏发生了一个错误_录屏教程的方法有哪些?学会这两种轻松搞定

    录屏教程的方法有哪些?在日常的工作以及生活当作,录屏教程的需求是经常需要做的.比方说:工作的时候,需要录屏新产品操作教程.生活中需要录屏学习基础教程等等.所以,对于录屏教程能够找到一个好用的方法是非常 ...

  5. U盘启动盘制作方法 2种绝招轻松搞定

    U盘装系统目前是非常流行的,有这么一句话说的好"U盘在手,系统无忧".就一个小小的U盘便于随身携带,就一个小小的U盘就能解决我们Windows系统崩溃的烦恼,那么好的事不用白不用. ...

  6. 【多屏协同办公,无系统限制】超简单!手机电脑互投屏,手机/电脑投TV怎么搞?三个免费软件轻松搞定!(无手机、电脑系统限制~)

    超简单!手机电脑互投屏,手机/电脑投TV怎么搞?三个免费软件轻松搞定!(无手机.电脑系统限制~) 一.手机电脑投TV-乐播投屏(同时也在研发手机投电脑的需求,即将上线) 二.手机WiFi/数据线投电脑 ...

  7. ios app HTML5 白屏,App Store白屏怎么办?最全攻略轻松搞定(图文教程)

    相信很多iPhone用户都有遇到App Store白屏的情况,并且很多时候即使多次重退仍无济于事,今天小编为大家罗列五种办法,轻松搞定问题. 1.修改网络 DNS 对于很多用户来说,DNS 是个有点陌 ...

  8. ubantu 黑屏_手机黑屏、卡屏怎么办?几招就能轻松搞定!

    手机这个功能尤其丰富的东西,偶尔也会出现一些小毛病,比如说手机黑屏.卡屏,这对大部分用户来说应该都有遇到过.手机黑屏这真的是一件让人揪心又无奈的事情,相对于懂得这方面技术的人来说,毫无疑问是小菜一碟, ...

  9. 电脑可以录屏吗?3种方法轻松搞定电脑录屏

    案例:电脑上有录屏功能吗?电脑可以录屏吗? "在电脑看到十分有趣的视频,想要保存下来,但是无法下载,朋友说可以使用电脑录屏功能录制下来.电脑有录屏吗?电脑可以录屏吗?电脑视频怎么录制下来?有 ...

  10. android如果手机屏锁忘记了怎么办,手机屏幕锁忘记图案怎么办 自己也能轻松搞定...

    手机屏幕锁忘记图案怎么办 自己也能轻松搞定 来源:www.18183.com作者:皮卡时间:2015-04-07 手机功能也越来越强大,甚至可以替代电脑,所以手机中存储着大量的个人隐私,很多用户习惯使 ...

最新文章

  1. 使用Win API创建工具栏
  2. 使用dstat命令的插件查看mysql的io状态
  3. 14 款免费漂亮的 BuddyPress 主题
  4. 【数据结构与算法】之深入解析“回文数”的求解思路和算法示例
  5. 美货币政策突变给中国高房价…
  6. C++获取本机的ip地址程序
  7. 简单工厂抽象工厂工厂方法_让工厂美丽
  8. 使用IDEA创建Maven项目和Maven使用入门(配图详解)
  9. LeetCode 1246. 删除回文子数组(区间DP)
  10. [深度学习-原理]GAN(生成对抗网络)的简单介绍
  11. java软件架构设计方案_Java软件架构设计慨论
  12. 高可用性及容灾的几个衡量指标
  13. 问题 F: 编写函数:一维数组的逆序 (Append Code)
  14. JAVA中RGB字串转换为颜色
  15. 分享一下Java从基础到进阶各阶段视频教程
  16. VLAN、OSPF、GRE或IPSEC配置作业与抓包内容(新手入门)
  17. 基因重组-冲刺日志(第八天)
  18. 团队开发如何评估工作量
  19. mysql中字符串汇总_Mysql中常见字符串处理函数汇总
  20. 月薪过万必会的:双亲委托模型

热门文章

  1. horner算法matlab实现,使用Euclid和Horner算法的多项式求值
  2. 使用AT89C51芯片实现生日快乐歌
  3. undertale人物_传说之下人物介绍
  4. Crucible使用说明
  5. linux一键烧写应用程序工具--自制
  6. 仿蓝色理想网站的导航菜单
  7. tree是不是动词_tree是什么意思!
  8. 计算机游戏图形是什么意思,专业图形显卡和游戏显卡区别
  9. 签offer VS 签三方
  10. 微软公司软件测试工程师,【其它微软中国(Microsoft)工资】软件测试工程师待遇-看准网...