在Android中我有一些活动,比方说A,B,C .
在A我使用此代码打开B:
Intent intent = new Intent(this, B.class);
startActivity(intent);
在B中我使用此代码打开C:
Intent intent = new Intent(this, C.class);
startActivity(intent);
当用户点击C中的按钮时,我想回到A并清除后栈(关闭B和C) . 因此,当用户使用后退按钮B和C将不会显示时,我一直在尝试以下内容:
Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
但是当我回到活动A时,如果我使用后退按钮,B和C仍然会出现 . 我怎么能避免这种情况?
30 回答
logout.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); logout.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
您可以使用此示例从
Activity C
调用Activity A
Intent loout = new Intent(context, LoginActivity.class); loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(loout);
听起来像你需要通过使用
startActivityForResult()
从Activity B
开始Activity C
. 当您单击Activity C
中的按钮时,请调用setResult(RESULT_OK)
和finish()
,以便Activity C
结束 . 在Activity B
中,您可以通过自己调用finish()
来响应onActivityResult()
,然后您将被带回Activity A
.尝试按FLAG_ACTIVITY_CLEAR_TOP的文档中所述添加FLAG_ACTIVITY_NEW_TASK:
因此,启动
A
的代码将是:如何为相关活动添加清单文件:
到B和C的活动定义?它们不会被添加到Backstack中 . 不确定这是不是你想要的 .
这困扰了我很长一段时间 . 最后我通过这样做来解决这个问题:
在片段中,使用:
在Activity中,使用(添加一个与片段相比的意图标志
Intent.FLAG_ACTIVITY_CLEAR_TASK
):将
android:launchMode="singleTop"
添加到活动A的清单中的activity元素然后在启动活动A时使用
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
和intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
这意味着当启动活动A时,将清除其上的所有任务,以便A位于顶部 . 在根处创建一个新的后备堆栈,使用
singleTop
确保您只启动一次A(因为A现在由于..._CLEAR_TOP
而位于顶部) .从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
尝试使用
并不是
对于将来的研究,请尝试此代码 .
如果您的应用程序具有最低sdk版本16,那么您可以使用 finishAffinity()
完成此活动以及当前任务中具有相同亲缘关系的紧接其下的所有活动 .
这对我有用 . 在Top Top屏幕中删除所有后栈活动,
http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29
根据Wakka在Removing an activity from the history stack中...
将
android:noHistory="true"
属性添加到AndroidManifest.xml
中的<activity>
,如下所示:使用finishAffinity();在任务C中启动任务A以清除后台堆叠活动 .
使用此代码启动新活动并关闭或销毁所有其他活动堆栈或返回satack ...
我发现这里的答案有点误导,因为原始问题中的代码似乎对我有用吗?
如果A是根活动,则仅使用FLAG_ACTIVITY_CLEAR_TOP从B或C启动它会从后端堆栈中删除B和C.
Intent.FLAG_ACTIVITY_CLEAR_TOP
在这种情况下不起作用 . 请使用(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
有关更多详细信息,请查看this文档 .
我发现了一个可能有用的有趣解决方案 . 我在
onBackPressed()
方法中做到了这一点 .FinishAffinity
删除现有活动与其堆栈的连接 . 然后完成帮助您退出该活动 . 哪个将最终退出应用程序 .我尝试了所有解决方案,但没有一个单独为我工作我的解决方案是:
在Android清单中使用
[android:launchMode="singleTop"]
将Activity A
声明为SingleTop
.现在从任何地方启动
A
时添加以下标志 . 它将清除堆栈 .除了
FLAG_ACTIVITY_CLEAR_TOP
之外,您还可以尝试添加Intent.FLAG_ACTIVITY_SINGLE_TOP
:intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
给定的代码正常工作 . 我已尝试过Application Life Cycle样本 .
在使用flag,FLAG_ACTIVITY_CLEAR_TOP启动活动A之后,我没有在后台堆栈中获得B和C.
我在开始新意图后打电话给
activity_name.this.finish()
,它对我有用 .但它对我不起作用......我不建议使用这个解决方案,但如果设置标志对你不起作用,你可以尝试这个..但我仍然建议不要使用它
在意图中添加NO History Flag .
在活动B中,启动活动C,如下所示>>>>>>
在清单中
和
将此添加到您的
Activity B
和Activity C
或
Override
onBackPressed
函数以避免用return
反压 .Use setFlags() method for clear back side opened all activity close and start yourActvity
这对我来说对onBackPressed很有用:
这是一个非常古老的答案,我没有真正找到一个合适的解决方案,为了清除backStack的唯一目的,我决定创建我自己的backstack,这甚至不是堆栈tbh,但它没有因为我们想要清除其中的所有内容;
每次都有一个堆叠的后纵梁,但它给了我所需的控制权;
首先声明一个公共静态活动列表(或片段,无论你需要什么);
在所有其他活动的onCreate方法中:
最后,当您要清除后台堆栈时,只需致电: