【问题标题】:How to avoid black screen on startActivity when FLAG_ACTIVITY_CLEAR_TASK is set?设置 FLAG_ACTIVITY_CLEAR_TASK 时如何避免 startActivity 出现黑屏?
【发布时间】:2015-05-14 23:17:01
【问题描述】:

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

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>

谢谢!

【问题讨论】:

  • 修复您的应用程序,使其在 onCreate() 中不会做太多事情。将这些内容卸载到您在 onCreate() 中启动的后台线程中。
  • 不幸的是,我无法再优化它了(该应用程序有一些非常特殊的视觉设计指南,需要在主线程中对背景图像进行一些处理)。无论如何,这不是的问题。我附上了示例代码,可以在任何项目中重现它,即使是一个什么都不做的活动。
  • 另一种选择是使用Intent.FLAG_ACTIVITY_CLEAR_TOP 而不是CLEAR_TASK。这仅在您将MyNewActivity 的原始实例留在堆栈中时才有效(即:当您启动其他活动时不要完成它)。如果仍然无法解决,您可以尝试Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP。这将从堆栈中清除所有其他活动并返回到MyNewActivity 的现有实例。在这种情况下,您可以向Intent 添加一个“额外”,MyNewActivity 可以签入onNewIntent(),如果设置,它可以重新初始化。
  • 我已经检查了其他Intent 启动模式,FLAG_ACTIVITY_CLEAR_TOP 在我的情况下没有用,因为我可能永远不会启动MyNewActivity,我想清除所有以前的活动堆栈。例如,我有以下流程:A->B->C->D->MyNewActivity 我想从我的活动堆栈中删除AB、@ 987654351@和D活动,并启动MyNewActivity。唯一符合我要求的标志是Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK。至少,这是我所知道的唯一一个。
  • 您应该在开始新活动后删除FLAG_ACTIVITY_CLEAR_TASK 并改为调用finish()this link 帮了我很多。

标签: android android-intent android-activity flags


【解决方案1】:

要完全避免“黑屏”(又名“预览”),您可以将以下内容添加到您的 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>

【讨论】:

  • 非常感谢!没想到展示的是预览!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
相关资源
最近更新 更多