您如何使用Intent.FLAG_ACTIVITY_CLEAR_TOP清除活动堆栈?


84

我已经阅读了有关使用此功能的几篇文章,但一定会丢失一些东西,因为它对我不起作用。我的活动A在清单中有launchmode =“ singleTop”。它以launchmode =“ singleInstance”启动活动B。活动B打开浏览器并接收并返回意图,这就是为什么它是singleInstance的原因。我试图覆盖“后退”按钮,以便将用户发送回活动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,Browser,B

我希望此代码将堆栈更改为... A ...,以便再次按回可将用户带回到主屏幕。

相反,似乎将堆栈更改为... A,B,Browser,B,A ...,好像这些标志不存在。

我尝试在startActivity之后在活动B中调用finish(),但是后退按钮再次将我带回到浏览器!

我想念什么?谢谢!

Answers:


72

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

它已隐藏在文档中,但是您必须将的更改launchMode为以外的Activity任何其他值standard。否则,它将被销毁并重新创建,而不是重置到顶部。


51
实际上...Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP会做到这一点。
Derk-Jan

查看Steel_fedex的解决方案示例。
2014年

2
那么Steel_fedex的解决方案到底在哪里?
ChangWon Jeong Juicycool

112

我已经开始活动A-> B-> C-> D。当按下活动DI上的后退按钮时,要转到活动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);
}       

4
该解决方案关闭了所有中间活动;而且,重新启动RootActivity。您可以在下面查看@Steel_Fedex的解决方案。它执行相同的操作,但不会重新启动RootActivity。
2014年

这是针对我的情况的最佳解决方案。我实际上希望根活动再次开始
Tash Pemhiwa

24

为此,我使用FLAG_ACTIVITY_CLEAR_TOP标志开始Intent
(不带FLAG_ACTIVITY_NEW_TASK

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

好像它可以按我的需要工作-活动不会重新启动,所有其他活动都已关闭。


我检查了一下,Bitster解决方案不起作用。虽然此解决方案有效。RootActivity没有重新启动。
2014年

更明智地选择您的单词。Bitestar解决方案实际上有效!
Jesper Bischoff-Jensen 2014年

singleTask为我工作,因此Activity将不会重新创建,并且不会在onNewIntent中处理事件。
陈吉士

11

尽管这个问题已经有了足够的答案,但我认为有人会想知道为什么这个标志以这种特殊的方式起作用,这就是我在Android文档中找到的

在上面的示例中,活动B的当前正在运行的实例将通过onNewIntent()方法接收您在此处开始的新意图,或者自身完成并使用新意图重新启动。

如果已将其启动模式声明为“多个”(默认),并且您未将FLAG_ACTIVITY_SINGLE_TOP设置为相同的意图,则它将完成并重新创建;否则,它将重新创建。对于所有其他启动模式,或者如果设置了FLAG_ACTIVITY_SINGLE_TOP,则此Intent将被传递到当前实例的onNewIntent()。


因此,
1launchMode将活动A的更改为其他标准(即singleTask其他)。这样,您的标志FLAG_ACTIVITY_CLEAR_TOP将不会重新启动活动A。

要么,

2。使用Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP为您的标志。然后它将按照您想要的方式工作。


8

我使用三个标志来解决问题:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|
                Intent.FLAG_ACTIVITY_CLEAR_TASK | 
                Intent.FLAG_ACTIVITY_NEW_TASK);


3

activity_name.this.finish()开始新的意图后打电话给我,这对我有用。

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

但这对我不起作用...我不建议使用此解决方案,但如果设置标志对您不起作用,那么您可以尝试一下。.但是我仍然建议不要使用它


2

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

可能使他失望的是,A应该是singleTop,而应该是singleTask。如果A是singleTop,并且B启动A,则将创建新的A,因为A不在B的任务中。从singleTop的文档中:

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

由于B启动了A,因此当前任务是B的任务,它是针对singleInstance的,因此不能包含A。请使用singleTask在此处获得所需的结果,因为系统会找到具有A的任务并将该任务置于前台。

最后,在B启动A,并且用户从A按下后,OP不想看到B或浏览器。为此,在B中调用finish()是正确的;同样,FLAG_ACTIVITY_CLEAR_TOP不会删除A任务中的其他活动,因为他的其他活动都在不同的任务中。他缺少的部分是,B在激发浏览器意图时也应使用FLAG_ACTIVITY_NO_HISTORY。 注意: 如果浏览器甚至在启动OP的应用程序之前已经在运行,那么当您从A按下时,您当然会看到浏览器。因此,要进行实际测试,请确保在启动应用程序之前退出浏览器。


1

FLAG_ACTIVITY_NEW_TASK是这里的问题,它会启动一个新任务。只需将其删除即可。

好吧,我建议您在与他们合作之前阅读每个Flag所做的工作

在此处阅读此内容意图标志


1
我确实读过标志,听起来像我需要的。无论如何,删除FLAG_ACTIVITY_NEW_TASK均不会影响结果。仍然是一个无穷无尽的后退按钮循环... A-> B,回到A,回到B,回到A ...
piusvelte 2010年

确定要使用B作为singleInstance的原因吗?AA“ singleInstance”活动的行为就像意图中的FLAG_ACTIVITY_NEW_TASK。请查看developer.android.com/guide/topics/fundamentals.html
100rabh 2010年

B需要接收来自浏览器的回叫意图。我尝试将启动模式更改为singleTask,并且仍然有效,但是后退按钮循环仍然发生。
piusvelte 2010年

我认为这没有用,因为您在那里使用了FLAG_ACTIVITY_NEW_TASK。最好只使用FLAG_ACTIVITY_CLEAR_TOP并避免同时使用singleTask和singleInstance
100rabh 2010年

1
我认为这应该是一个Intent.FLAG_ACTIVITY_SINGLE_TOP
可行的

1

最初,我还无法使FLAG_ACTIVITY_CLEAR_TOP正常工作。最终,我通过使用它的值(0x04000000)使它工作。因此,似乎存在Eclipse /编译器问题。但是不幸的是,幸存的活动重新开始了,这不是我想要的。因此,似乎没有简单的解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.