设置FLAG_ACTIVITY_CLEAR_TASK时如何避免startActivity上出现黑屏?

时间:2015-03-12 17:00:08

标签: android android-intent android-activity flags

我正在使用以下内容启动新活动:

Intent intent = new Intent(this, MyNewActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
overridePendingTransition(0, 0);

MyNewActivity正在启动时,会显示黑屏。

如果我删除Intent.FLAG_ACTIVITY_CLEAR_TASK,则会在不显示黑屏的情况下启动活动(而是在新加载时显示上一个活动)。

有没有办法避免这种黑屏?删除标志似乎不是一个选项(我需要清除所有当前任务的堆栈并启动一个新的活动作为根目录。)

编辑:我附上了一个非常简单的代码,可以重现问题(为应用设置了一个黑暗主题,例如Theme.AppCompat)。黑屏显示的时间非常短(取决于启动时接收活动的工作量),但您可以看到它。如果您不使用FLAG_ACTIVITY_CLEAR_TASK,则不会显示黑屏,转换顺利:

MainActivity

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, MyNewActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
                overridePendingTransition(0,0);
            }
        });
    }
}

MyNewActivity

public class MyNewActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new);
    }
}

activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_blue_bright">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="CLICK ME!" />

</RelativeLayout>

activity_new.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_green_light">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="I am the new activity!" />

</RelativeLayout>

谢谢!

1 个答案:

答案 0 :(得分:21)

要完全避免“黑屏”(又名“预览”),您可以将以下内容添加到AppTheme

<style name="AppTheme" parent="Theme.AppCompat">
    <item name="android:windowDisablePreview">true</item>
    ...
</style>

然而,更好的方法是在Activity.onCreate期间在主线程上做更少的事情,并在用户等待时显示预览屏幕。 要实现平滑过渡,您可以为窗口设置自定义背景,将其添加到主题中:

<style name="AppTheme" parent="Theme.AppCompat">
    <item name="android:windowBackground">@drawable/slash_screen</item>
    ...
</style>