【发布时间】: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我想从我的活动堆栈中删除A、B、@ 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