你如何使用Intent.FLAG_ACTIVITY_CLEAR_TOP清除Activity Stack?

我已经阅读了几篇关于使用这个文章的post,但是一定是错过了一些东西,因为它不适合我。 我的活动A在清单中有launchmode =“singleTop”。 它启动活动B,launchmode =“singleInstance”。 活动B打开一个浏览器并接收和意图回来,这就是为什么它是singleInstance。 我正在尝试覆盖后退button,以便将用户发送回活动A,然后可以按返回离开活动,而不是再次返回到活动B.

// activity B @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR && keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) onBackPressed(); return super.onKeyDown(keyCode, event); } @Override public void onBackPressed() { startActivity(new Intent(this, UI.class) .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK)); return; } 

从浏览器返回后,堆栈是… A,B,浏览器,B

我期望这个代码将堆栈更改为… A …以便再次按回用户返回到主屏幕。

相反,它似乎将堆栈更改为… A,B,浏览器,B,A …好像这些标志不存在。

我在startActivity之后尝试在activity B中调用finish(),但后退button又把我带回浏览器!

我错过了什么? 谢谢!

@bitestar有正确的解决scheme,但还有一个步骤:

它隐藏在文档中,但是您必须将“ ActivitylaunchMode更改为除standard以外的其他任何内容。 否则,它将被销毁并重新创build,而不是重置到顶端。

我已经开始活动A-> B-> C-> D。 当活动DI上的后退button想要转到活动A时,由于A是我的起始点,因此已经在堆栈上清除A顶部的所有活动,并且不能从A返回任何其他活动。

这实际上在我的代码中工作:

 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { Intent a = new Intent(this,A.class); a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(a); return true; } return super.onKeyDown(keyCode, event); } 

为此,我使用FLAG_ACTIVITY_CLEAR_TOP标志来启动Intent
(没有FLAG_ACTIVITY_NEW_TASK

launchMode = "singleTask"在已启动活动的清单中。

看起来像它的工作,因为我需要 – 活动不重新启动,所有其他活动都closures。

虽然这个问题已经有了足够的答案,但我想有人会想知道为什么这个标志以这种奇特的方式工作,这是我在Android文档中发现的

在上面的例子中,当前正在运行的活动B的实例将会在onNewIntent()方法中接收到你从这里开始的新的意图,或者自己完成并重新启动新的意图。

如果它已经声明它的启动模式是“多个”(默认),并且你没有在同一个意图中设置FLAG_ACTIVITY_SINGLE_TOP,那么它将被完成和重新创build; 对于所有其他启动模式,或者如果设置了FLAG_ACTIVITY_SINGLE_TOP,则这个Intent将被传递到当前实例的onNewIntent()。

所以呢,
1 。 将ActivityA的launchMode更改为标准(即singleTask或其他)的其他内容。 那么您的标志FLAG_ACTIVITY_CLEAR_TOP将不会重新启动您的活动A.

要么,

2 。 使用Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP作为你的标志。 那么它会按照你的意愿工作。

我知道已经有一个可以接受的答案,但我不明白它是如何工作的OP,因为我不认为FLAG_ACTIVITY_CLEAR_TOP在他的特定情况下是有意义的。 该标志只与同一项任务中的活动有关。 根据他的描述, 每个活动都有自己的任务 :A,B和浏览器。

可能把他扔掉的东西是A是单顶,当它应该是单任务。 如果A是singleTop,B开始A,那么将会创build一个新的A,因为A不在B的任务中。 从singleTop的文档:

“如果活动的一个实例已经存在于当前任务的顶部,则系统将意图路由到该实例…”

由于B开始A,当前任务是B的任务,这是单个实例的任务,因此不能包含A.使用singleTask在那里获得所需的结果,因为那么系统将find具有A的任务并将该任务带到前台。

最后,B启动A后,用户从A后退,OP不想看到B或浏览器。 为了达到这个目的,在B中调用finish()是正确的。 再次,FLAG_ACTIVITY_CLEAR_TOP不会删除A任务中的其他活动,因为他的其他活动都在不同的任务中。 他所缺less的一部分,虽然是B也应该使用FLAG_ACTIVITY_NO_HISTORY时发射浏览器的意图。 注意:如果浏览器在启动OP应用程序之前已经运行,那么当然你会从A中按下来看到浏览器。所以为了真正testing这个,确保在启动应用程序之前退出浏览器。

FLAG_ACTIVITY_NEW_TASK是启动新任务的问题,只要将其删除即可。

那么我build议你在与他们合作之前阅读每个国家的标准

阅读这里 & 意图标志在这里

最初,我也遇到了FLAG_ACTIVITY_CLEAR_TOP工作的问题。 最终我通过使用它的值(0x04000000)得到它的工作。 所以看起来像是Eclipse /编译器问题。 但不幸的是幸存的活动重新启动,这不是我想要的。 所以看起来像没有简单的解决scheme。

我开始新的意图后,我叫activity_name.this.finish() ,它为我工作。

 I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK" 

但它不会为我工作…我不是build议这个解决scheme的使用,但如果设置标志不会为你工作比你可以试试这个..但是我仍然build议不要使用它

清单文件中添加android:noHistory =“true”。

 <manifest > <activity android:name="UI" android:noHistory="true"/> </manifest>