在Android中,我有一些活动,例如A,B,C。

在A中,我使用以下代码打开B:

Intent intent = new Intent(this, B.class);
startActivity(intent);


在B中,我使用以下代码打开C: (同时关闭B和C)。因此,当用户使用后退按钮B和C不会显示时,我一直在尝试以下操作:

回到活动A时,我使用后退按钮。如何避免这种情况?

#1 楼

尝试按照文档中关于FLAG_ACTIVITY_NEW_TASK的说明添加FLAG_ACTIVITY_CLEAR_TOP: br />启动任务的根活动,它会将该任务的任何当前正在运行的
实例带到
前台,然后将其清除为
根状态。例如,这在从通知管理器启动
活动时特别有用。


因此,启动A的代码为:

Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);
CurrentActivity.this.finish(); // if the activity running has it's own context


// view.getContext().finish() for fragments etc.


评论


谢谢,但是我已经尝试过了。仍然当我点击后退按钮后,它再次显示C。我会缺少什么?

–马丁
2011年4月26日在18:30

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

– dzeikei
2012年6月19日下午4:18

对我不起作用,但是在源活动上调用finish()可以实现我所需的功能

– 2cupsOfTech
14年7月23日在17:08

我有一个同样的问题,那就是它不起作用。对我来说解决的是在开始新活动后调用finish()

–阿诺·范·利休(Arno van Lieshout)
2014年10月6日12:32

我还添加了一个更清晰的Intent intent = new Intent(SingUpActivity.this,LoginActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);完();

–山姆
16-4-27在12:49



#2 楼

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


评论


就CLEAR_TOP标志而言,这种组合是唯一可以完全清除整个堆栈并使新活动成为应用程序中唯一活动的组合。谢谢!

–航空总收入
2015年3月8日在6:31

这和接受的答案有什么区别?

– Yuuri Heupa
2015年9月24日,下午1:59

谢谢,与可接受答案的区别在于,使用此标志,我们不需要调用activity.finish

– Pablo Cegarra
17年2月16日在12:51

FLAG_ACTIVITY_CLEAR_TASK与NEW_TASK完美配合

– Shamsul Arefin Sajib
18年5月9日在13:10

这应该是公认的答案。非常感谢你。

–丹麦Ansari
18年7月25日在15:10

#3 楼

如何在清单文件中添加相关活动:

android:noHistory="true"


到B和C的活动定义?它们不会被添加到堆栈中。不知道那是不是你想要的。

评论


使用此功能时请务必小心-如果您要使用FB或其他类似功能登录

–天网
2015年3月2日,12:26

@天网为什么?这样做有什么问题?

–阿尔菲·伍德兰(Alfie Woodland)
15年3月12日在16:32

当您将控制权从不存在任何历史记录的页面传递给FB进行登录时,FB应用程序在用户登录后现在无法登录,在我的情况下,该应用程序返回了电话主屏幕,我几乎失去了工作!

–天网
2015年3月13日在7:18



这不允许将活动添加到堆栈...。这不是正确的解决方案。

–塔伦
16年4月19日在5:17

正是我在寻找

– Masum
18年6月26日在10:50

#4 楼

这使我困扰了很长时间。最后我通过执行以下操作解决了问题:

在片段中,使用:使用(与片段相比,再添加一个意图标志Intent.FLAG_ACTIVITY_CLEAR_TASK):

Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);


评论


如果您使用的是androidannotation,则必须添加:Intent.FLAG_ACTIVITY_CLEAR_TASK

– yosafatade
2014-09-26 15:58

活性山黄素对我来说很好。尽管我认为使用API​​ 16,但Daniel Schuler的解决方案更容易。

– PhilippS
2014-12-8 20:46



谢谢yosafatade,那是我所缺少的!

–马蒂·米勒(Marty Miller)
16-09-13在2:25

#5 楼


android:launchMode="singleTop"添加到清单A中的活动A的活动元素中
,然后在启动活动A时使用intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

,这意味着启动活动A时,清除位于其顶部的所有任务,使A位于顶部。将创建一个新的后向堆栈,其根为A,并使用singleTop确保只启动一次A(由于..._CLEAR_TOP导致A现在位于顶部)。

评论


是。这就是我现在正在使用的功能,但是没有做到。当我按下后退按钮时,仍然显示C。

–马丁
2011年4月26日在18:47

奇怪的是,我在项目中使用了它,并且效果很好……按回去会将我带到主屏幕。也许还有其他事情正在发生。您可以张贴清单吗?

–约瑟夫·伯爵
2011年4月26日在18:48

我重新启动了模拟器,现在好像您说的那样,它正在工作。非常感谢你的帮助!

–马丁
2011年4月26日在19:23

singleTop应该与清除堆栈无关。

–stdout
16年7月26日在12:27

#6 楼

从API 16(Jelly Bean)开始,您只需调用finishAffinity()即可。

现在您还可以使用兼容性库调用ActivityCompat.finishAffinity(Activity activity)

请确保在清单中设置taskAffinity到该活动组唯一的程序包名称。

有关更多信息,请参见:http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#finishAffinity% 28android.app.Activity%29

评论


如果您已经使用API​​ 16,那将是非常有用且简单的解决方案。为我工作!

– PhilippS
2014年12月8日20:47

提醒:这仅适用于共享相同taskAffinity名称的活动

–雷汉
15年8月28日在23:09



仅当您在历史记录中只有一项活动时,此功能才有效。

–缺席
16-10-5在19:51

#7 楼

尝试使用

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);


,而不是

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);


评论


这有效。我的假设是使用setFlags将替换所有默认设置标志,但事实并非如此

–威廉
20年7月7日在14:42

#8 楼

如果您的应用程序的sdk版本最低为16,则可以使用
finishAffinity()

完成此活动以及当前任务中紧接其下的所有具有相同相似性的活动。

这对我来说是工作.android.com / reference / android / app / Activity.html#finishAffinity%28%29

#9 楼

按照Wakka在“从历史记录堆栈中删除活动” ...


android:noHistory="true"属性添加到<activity>中的AndroidManifest.xml中,如下所示: >

#10 楼

为了以后的研究,请尝试以下代码。

Intent intent = new Intent(context, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();


评论


这些标志终于对我有用。我所做的就是使用这些标志和一个布尔值EXIT = true进行了与我相同的活动。在onCreate()中,我检查了EXIT的启动参数,如果设置为true,则称为finish()。关闭自己的应用程序很麻烦。

–珍妮·奥克桑宁(Janne Oksanen)
15年8月20日在13:23

#11 楼

使用finishAffinity();启动任务A以清除后退堆栈活动时在任务C中进行操作。

评论


只有这个答案对我有用。不需要Intent.FLAG_ACTIVITY_CLEAR_TOP和Intent.FLAG_ACTIVITY_NEW_TASK

–盐酸胆碱
17年2月3日在15:30

#12 楼

使用此代码可以启动新的活动并关闭或销毁所有其他活动堆栈或后堆栈。

Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);


#13 楼

Use finishAffinity() to clear all backstack with existing one.

Suppose, Activities A, B and C are in stack, and finishAffinity(); is called in Activity C, 

    - Activity B will be finished / removing from stack.
    - Activity A will be finished / removing from stack.
    - Activity C will finished / removing from stack.


#14 楼

我找到了一个有趣的解决方案,可能会有所帮助。我是通过onBackPressed()方法实现的。

finishAffinity();
finish();


FinishAffinity删除了现有活动与其堆栈的连接。然后完成帮助您退出该活动。最终将退出应用程序。

#15 楼

我发现这里的答案有些误导,因为原始问题中的代码对我来说似乎很好?后堆栈中的C。

#16 楼

在kotlin中,它几乎类似于java。仅|符号由或文本替换。
因此,它的写法类似于-

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)


#17 楼

我尝试了所有解决方案,但没有一个适合我。
我的解决方案是:

通过在Android清单中使用Activity ASingleTop声明为[android:launchMode="singleTop"]

现在添加以下内容从任何地方启动A时显示标志。它将清除堆栈。

Intent in = new Intent(mContext, A.class);
in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
startActivity(in);
finish();


#18 楼

在这种情况下,Intent.FLAG_ACTIVITY_CLEAR_TOP将不起作用。请使用(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)

有关更多详细信息,请查阅此文档。

#19 楼

在我看来,您需要使用Activity CActivity B启动startActivityForResult()。当您单击Activity C中的按钮时,请调用setResult(RESULT_OK)finish(),以便Activity C结束。在Activity B中,您可以通过自己调用onActivityResult()来使finish()做出响应,然后将您带回到Activity A

评论


是的,但是如果A和C之间有42个活动,这将非常乏味。标志FLAG_ACTIVITY_CLEAR_TOP应该直接执行OP想要的操作。

–纪尧姆·布鲁尼(Guillaume Brunerie)
2011年4月26日在18:10

这不是实现OP所需的最佳方法,正如@Guillaume所说,在根与栈顶之间的所有活动中都需要代码。

–杰克·巴斯勒(Jake Basile)
2011年4月26日在18:15

适当注意。这些是我显然需要了解的标志。

– Maximus
2011年4月26日在18:16

#20 楼

logout.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
logout.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

#21 楼

您可以使用此示例从Activity A中调用您的Activity C

Intent loout = new Intent(context, LoginActivity.class); loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(loout);

#22 楼

对我来说,添加Intent.FLAG_ACTIVITY_CLEAR_TASK解决了问题

Intent i = new Intent(SettingsActivity.this, StartPage.class);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP  | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i);
finish();


#23 楼

可重复使用的高级Kotlin:

您可以使用setter方法直接设置标志。在Kotlin中,or替代了Java的逐位或|
intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK


然后您可以在启动意图之前直接调用此函数

fun Intent.clearStack() {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}


如果在其他情况下需要选择添加其他标志,在扩展功能中添加可选参数。

intent.clearStack()


#24 楼

除了FLAG_ACTIVITY_CLEAR_TOP之外,您还可以尝试添加Intent.FLAG_ACTIVITY_SINGLE_TOP

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

评论


那只会影响堆栈顶部的活动,而不会影响其根。

–杰克·巴斯勒(Jake Basile)
2011年4月26日在18:13

#25 楼

给定的代码可以正常工作。我已经尝试了应用程序生命周期示例。

#26 楼

在启动新的意图后,我打电话给activity_name.this.finish(),它对我有用。

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"


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

#27 楼

在意图中添加NO历史标记。

在活动B中,按如下所示启动活动C >>>>>>

Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(intent);
finish();


#28 楼

在清单中

android:launchMode="singleTask"




intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);


#29 楼

将其添加到您的Activity BActivity C

android:noHistory="true"


Override onBackPressed函数,以避免使用return反向按下。

@Override
public void onBackPressed() {
   return;
}


#30 楼

使用setFlags()方法清除背面打开的所有活动,然后关闭并启动yourActvity

Intent intent = new Intent(getApplicationContext(), yourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);