zoukankan      html  css  js  c++  java
  • Android Activity启动黑/白屏原因与解决方式 coder

    Android Activity启动黑/白屏原因与解决方式

      我们新建一个HelloWorld项目,运行在手机上时,Activity打开之前会有一个动画,而这个动画里是全白或者全黑的(取决于你的主题是亮还是暗),我们结束进程并点击在桌面上的APP图标,同样会有这个现象出现。当我们打开手机上安装的各个公司的APP时,可以发现其中大部分APP的启动动画都是有颜色有图案的,当然也有一小部分APP是全黑或全白的。那么为什么会出现这种情况呢?


    此文章已收入[Android偶遇杂症合集(持续更新)](https://www.cnblogs.com/hwb04160011/p/13960539.html)

     

      Activity启动黑/白屏的原因

      一个Activity的显示内容有哪些呢?我们在Activity的onCreate()方法中调用了setContentView()方法,传入了我们绘制的layout文件,也就是我们理论上应该看到的Activity内容。但是Android系统在启动一个新的Activity时,首先进行的并不是绘制Activity Content View,我们来看看一个Activity的UI结构。

      我们可以看到,一个Activity中在ContentView的外围还有PhoneWindow、DecorView、TitleView,当Activity进行绘制时会先绘制这三个控件,这时ContentView还没加载进来,所以什么东西都看不到,系统会将屏幕填充主题默认的背景色,亮系主题填充白色,暗系主题填充黑色,就出现了Activity启动之前的黑/白屏现象。

      解决办法

      刚才说了,系统会为屏幕填充主题默认的背景色,那么要解决这个问题就应该从屏幕的背景下手了。一想到背景,第一反应就是去layout里设置ContentView的background,但是系统并不会先加载ContentView,那有什么在系统绘制之前就能调整屏幕背景呢?注意,系统会填充主题默认的背景色,所以主题会在绘制之前加载,我们可以修改主题的背景达到目的。一般一个APP第一个启动的Activity都是Splash,作为一个Splash并不需要标题栏,而且普遍是全屏的。那么我们可以将主题进行修改一下:

      (1)将主题背景变成透明的,这样在ContentView加载出来之前,我们会透过启动的Activity看到桌面,就不会有黑/白屏的现象。再把标题栏去掉,把Activity设置成全屏的,效果挺不错,缺点是如果启动的是一个有复杂耗时操作的Activity,那么会有一种延迟的感觉。

    <style name="AppTheme" parent="android:Theme.Light.NoTitleBar">  
        <item name="android:windowIsTranslucent">true</item>  
        <item name="android:windowNoTitle">true</item>  
        <item name="android:windowActionBar">false</item>  
        <item name="android:windowBackground">@android:color/transparent</item>  
        <item name="android:WindowFullscreen">true</item>
    </style>  

      (2)将主题背景设置成一张图片,但是图片的屏幕适配问题就需要考虑了,主题里的背景图片会自动拉伸。

    <style name="AppTheme" parent="android:Theme.Light.NoTitleBar">  
        <item name="android:windowNoTitle">true</item>  
        <item name="android:windowActionBar">false</item>  
        <item name="android:windowBackground">@drawable/bg_splash</item>  
        <item name="android:WindowFullscreen">true</item>
    </style> 

      我建议使用第一种方式,尽量减少Splash里的耗时操作,主要操作交给MainActivity才是一个明智的选择。

  • 相关阅读:
    【Element UI】el-tooltip组件(提示消息) 换行
    复合文件CFB的存储结构及格式解析
    luogu P3801 红色的幻想乡 |容斥+树状数组
    luogu P3602 Koishi Loves Segments |堆+离散化贪心
    luogu P2048 [NOI2010] 超级钢琴 |堆+RMQ
    钉钉机器人使用注意事项
    k8s-部署
    docker 总结
    Navicat15最新版本破解 亲测可用!!!(Navicat Premium 注册出现 No All Pattern Found! File Already Patched)
    继续开始web的学习
  • 原文地址:https://www.cnblogs.com/hwb04160011/p/8041429.html
Copyright © 2011-2022 走看看