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));
    }
}

 

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

posted @ 2020-07-17 14:58  仙人湖中的鱼  阅读(1168)  评论(0编辑  收藏  举报