Android:清除后面的堆栈
在Android中,我有一些活动,比如说A,B,C
在AI中使用这个代码来打开B:
Intent intent = new Intent(this, B.class); startActivity(intent);
在BI中使用这个代码来打开C:
Intent intent = new Intent(this, C.class); startActivity(intent);
当用户点击CI中的按钮想要返回到A并清除后退堆栈(同时关闭B和C)。 所以当用户使用后退按钮B和C不会显示,我一直在尝试以下内容:
Intent intent = new Intent(this, A.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
但是当我回到活动A时,如果我使用后退按钮,B和C仍然显示出来。我怎样才能避免这种情况?
尝试按照FLAG_ACTIVITY_NEW_TASK
文档中的说明添加FLAG_ACTIVITY_CLEAR_TOP
:
这个启动模式也可以和FLAG_ACTIVITY_NEW_TASK结合使用:如果用来启动一个任务的根活动,它将会把当前正在运行的那个任务的实例带到前台,然后清除它的根状态。 例如,从通知管理器启动活动时,这是特别有用的。
所以你启动A
的代码是:
Intent intent = new Intent(this, A.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish(); // call this to finish the current activity
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent);
如何在清单文件中添加相关活动:
android:noHistory="true"
到B和C的活动定义? 他们不会被添加到后台。 不知道这是你想要的。
这让我困扰了很久。最后我这样做了:
在片段中,使用:
Intent intent = new Intent(view.getContext(), A.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
在Activity中,使用(添加一个多意图标志Intent.FLAG_ACTIVITY_CLEAR_TASK
比较片段):
Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
- 将
android:launchMode="singleTop"
添加到活动A的清单中的活动元素 - 然后在启动Activity A时使用
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
和intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
这意味着当活动A启动时,其上的所有任务都被清除,以便A位于顶部。 使用A创建一个新的后退堆栈,并使用singleTop
确保只启动一次A(因为A由于..._CLEAR_TOP
而位于顶端)。
从API 16(Jelly Bean)开始,你可以调用finishAffinity()
。
现在,您也可以使用兼容性库调用ActivityCompat.finishAffinity(Activity activity)
。
请务必将清单中的taskAffinity设置为该组活动所特有的软件包名称。
尝试使用
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
并不是
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
为了将来的研究,请试试这个代码。
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();
使用finishAffinity(); 在任务C中启动任务A清除后台活动。
按照Wakka 从历史堆栈中移除活动 …
将android:noHistory="true"
属性添加到AndroidManifest.xml
中的<activity>
中,如下所示:
<activity android:name=".MyActivity" android:noHistory="true"> </activity>
如果你的应用程序的最低版本是16,那么你可以使用finishAffinity()
在当前任务中完成此活动以及紧接其下的所有活动中具有相同亲和力的活动。
这是我的工作在顶部付款屏幕删除所有后备堆栈活动,
@Override public void onBackPressed() { finishAffinity(); startActivity(new Intent(PaymentDoneActivity.this,Home.class)); }
http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29
我在这里找到答案有点误导,因为原始问题中的代码似乎对我来说工作正常?
使用A作为根活动,从B或C开始只使用FLAG_ACTIVITY_CLEAR_TOP将B和C从后端堆栈中移除。
这听起来像你需要通过使用startActivityForResult()
从Activity B
启动Activity C
当你在Activity C
点击一个按钮时,调用setResult(RESULT_OK)
并finish()
这样Activity C
就结束了。 在Activity B
,你可以通过调用finish()
来响应onActivityResult()
,然后返回到Activity A
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);
我尝试了所有的解决方案,没有为我单独工作。 我的解决方案是:
在Android清单中使用[android:launchMode="singleTop"]
Activity A
声明为[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();
Intent.FLAG_ACTIVITY_CLEAR_TOP
在这种情况下不起作用。 请使用(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
有关更多详细信息,请查看此文档。
使用这个代码来开始新的活动,并关闭或摧毁所有其他活力堆栈或回大气…
Intent intent = new Intent(this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent);
除了Intent.FLAG_ACTIVITY_SINGLE_TOP
之外,您还可以尝试添加Intent.FLAG_ACTIVITY_SINGLE_TOP
:
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
给定的代码正常工作。 我已经在应用程序生命周期示例中尝试过。
在启动标志为FLAG_ACTIVITY_CLEAR_TOP的活动A后,我没有B和C在后面的堆栈中
我开始新的意图后,我叫activity_name.this.finish()
,它为我工作。
I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"
但它不会为我工作…我不是建议这个解决方案的使用,但如果设置标志不会为你工作比你可以试试这个..但是我仍然建议不要使用它
在意图中添加NO历史标志。
在活动B中,按如下方式启动活动C >>>>>>
Intent intent = new Intent(this, C.class); intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent); finish();
在清单中
android:launchMode="singleTask"
和
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
将其添加到您的Activity B
和Activity C
android:noHistory="true"
或Override
onBackPressed
功能,以避免返回按下。
@Override public void onBackPressed() { return; }
使用setFlags()方法清除背面打开所有活动关闭并启动您的重量
Intent intent = new Intent(getApplicationContext(), yourActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent);
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.
这是一个非常古老的答案,我真的没有找到一个适当的解决方案,以清理backStack的唯一目的,我决定创建我自己的backstack,这不是一个堆栈tbh,但它没有因为我们要清除它里面的一切
每次都是手忙脚乱,但是它给了我所需要的控制。
首先声明一个公共静态的活动列表(或碎片,无论你需要什么);
public static ArrayList <Activity> backStack = new ArrayList<>();
而在所有其他活动的onCreate方法中:
MainActivity.backStack.add(this);
最后,当你想清除后台时,只需调用:
public static void killBackStack () { for (Activity ac : backStack) { if (ac != null) ac.finish(); } }
Intent intent = new Intent(this, A.class); startActivity(intent); finish();