zoukankan      html  css  js  c++  java
  • Android Activity启动优化 白屏/黑屏解决方法

    Android Activity启动优化 白屏/黑屏解决方法

    新建一个HelloWorld项目,运行到手机上时,Activity打开之前会有一个动画,而这个动画是全白或者全黑的(取决于你的主题是亮还是暗),我们结束进程并点击桌面上的APP图标,同样会出现这个现象。那么为什么会出现这个问题呢?

    Activity启动白/黑屏的原因?

    我们所能看到的Activity内容,也就是onCreate()方法中调用setContentView()方法所传入的自己绘制的layout文件。但是Android系统在启动一个新的Activity时,首先运行的并不是ContentView,来看看Activity的UI结构:

     Activity的UI结构

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

    解决方案

    上面说了,系统会为屏幕填充主题默认的背景色,那么要解决这个问题就要从屏幕背景下手。这里分两种情况,一种起始页是自定义绘制的layout;另一种起始页是一张图片,不用在setContentView()加载。

    1、起始页是自定义绘制的layout

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

    (1)AndroidManifest.xml中给首页activity(第一个页面,一般是欢迎界面)设置自定义的theme

    <activity android:name=".activity.SplashActivity"
        android:theme="@style/SplashStyle">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    (2)styles.xml文件中添加以下代码

    <style name="SplashStyle" 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、起始页是一张图片,不用在setContentView()加载

      这种是用自定义的StartingWindow来优化。用户点击了图标启动应用,弹出应用自己定制的StartingWindow,等应用加载好第一帧之后,定制的StartingWindow消失,显示应用主界面,由于StartingWindow是自己定制的,启动的时候Decode Bitmap或者Inflate自己定义Layout会有一定的耗时,但是总的来说跟系统默认的差别不大,用户体验优。

    (1)AndroidManifest.xml中给首页activity(第一个页面,一般是欢迎界面)设置自定义的theme

    <activity android:name=".MainActivity"
        android:theme="@style/AppTheme.StartingWindowTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    (2)styles.xml文件中添加以下代码

    <!-- 应用启动页(StartingWindow)的theme -->
    <style name="AppTheme.StartingWindowTheme" parent="AppTheme">
        <!-- 可以设置成纯颜色(设置一个和Activity UI相似的背景) -->
        <!--<item name="android:windowBackground">@color/startingwindow_bgcolor</item>-->
        <!--也可以设置成一张图片 -->
        <item name="android:windowBackground">@drawable/eyeequip0</item>
    </style>

    (3)Activity里面回复原有的样式

    public class MainActivity extends AppCompatActivity {
        private ListDataScreenView mListDataScreenView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setTheme(R.style.AppTheme);//恢复原有的样式
            setContentView(R.layout.activity_main);

            mListDataScreenView = findViewById(R.id.list_data_screen_view);
            mListDataScreenView.setAdapter(new ListScreenMenuAdapter(this));
        }
    }

     

    综上就是今天的内容,欢迎指出不足!

  • 相关阅读:
    WPF TextBox 一些设置技巧
    Rust 初始配置
    Framework​Element.​Find​Name 根据名字查找控件
    C# SQLite 数据库操作
    MP3 信息读取
    C# event 事件学习
    Nginx 整合 Lua 实现动态生成缩略图
    Spring Cloud 入门 之 Config 篇(六)
    Spring Cloud 入门 之 Zuul 篇(五)
    Flyway 简单入门教程
  • 原文地址:https://www.cnblogs.com/dmrbell/p/13329973.html
Copyright © 2011-2022 走看看