Android:清除后堆栈
在安卓系统中,我有一些活动,比如A、B、C 在A中,我使用此代码打开B:Android:清除后堆栈,android,android-intent,android-activity,stack,Android,Android Intent,Android Activity,Stack,在安卓系统中,我有一些活动,比如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, 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仍然会出现。我如何避免这种情况?我觉得您需要使用
startActivityForResult()
从活动B
开始活动C
。单击活动C
中的按钮时,调用setResult(RESULT\u OK)
并finish()
以结束活动C
。在活动B
中,您可以让onActivityResult()
通过调用自身的finish()
来响应,然后您将返回到活动A
尝试按照文档中所述添加:
此启动模式也可用于
配合使用效果好
标记活动新任务:如果用于
启动任务的根活动,它
将带来任何当前正在运行的
将该任务的实例添加到
前景,然后将其清除到当前位置
根状态。这特别有用,,
例如,在启动
通知中的活动
经理
因此,启动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.
除了
FLAG\u ACTIVITY\u CLEAR\u TOP
,您还可以尝试添加Intent。FLAG\u ACTIVITY\u SINGLE\u TOP
:
intent.addFlags(intent.FLAG\u ACTIVITY\u SINGLE\u TOP)代码>
intent.addFlags(intent.FLAG\u ACTIVITY\u CLEAR\u TOP)代码>
将android:launchMode=“singleTop”
添加到活动A清单中的活动元素中
然后使用intent.addFlags(intent.FLAG\u ACTIVITY\u CLEAR\u TOP)
和
intent.addFlags(intent.FLAG\u ACTIVITY\u NEW\u TASK)
启动活动A时
这意味着,当启动活动A时,它上面的所有任务都将被清除,以便A位于顶部。在根目录下创建一个新的后堆栈,并使用singleTop
确保您只启动一次(因为…\u CLEAR\u top
现在A位于顶部)。为相关活动添加清单文件怎么样:
android:noHistory="true"
B和C的活动定义?它们不会添加到后台。不确定这是否是您想要的。我发现这里的答案有点误导,因为原始问题中的代码似乎对我很有用
当A是根活动时,仅使用标志“活动”从B或C开始,清除“顶部”会将B和C从后堆栈中移除。根据
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
将android:noHistory=“true”
属性添加到AndroidManifest.xml中的
,如下所示:
<activity android:name=".MyActivity"
android:noHistory="true">
</activity>
给定的代码工作正常。我在应用程序生命周期示例中进行了尝试
在使用flag、flag\u activity\u CLEAR\u TOP启动活动A后,我的后堆栈中没有B和C
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
而不是
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
从API 16(Jelly Bean)开始,您只需调用finishafinity()
现在,您还可以使用兼容性库调用ActivityCompat.finishafinity(Activity-Activity)
确保将清单中的taskAffinity设置为该活动组唯一的包名称
有关更多信息,请参阅:
注销.添加标志(意图.标志\u活动\u清除\u任务);
logout.addFlags(Intent.FLAG\u ACTIVITY\u NEW\u TASK) 这困扰了我很长时间。最后我通过这样做解决了这个问题:
在fragment中,使用:
Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
在活动中,使用(与片段相比,再添加一个意图标志intent.flag\u Activity\u CLEAR\u TASK
):
在启动新的intent之后,我调用了activity\u name.this.finish()
,它对我有效
I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"
但这对我不起作用。。。我不建议使用此解决方案,但如果设置标志对您不起作用,您可以尝试使用此解决方案。但我仍然建议不要使用此解决方案进行未来研究,请尝试此代码
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();
在意图中不添加历史标记
在活动B中,按如下方式启动活动C>>>>>>>
Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
finish();
Intent.FLAG\u ACTIVITY\u CLEAR\u TOP
在这种情况下不起作用。请使用(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
有关更多详细信息,请查看文档。如果您的应用程序具有最低sdk版本16,则可以使用
finishafinity()
完成此活动以及当前任务中紧靠其下方具有相同关联性的所有活动
这是我的工作
在顶部付款屏幕中,删除所有后台活动
@Override
public void onBackPressed() {
finishAffinity();
startActivity(new Intent(PaymentDoneActivity.this,Home.class));
}
我尝试了所有的解决方案,但没有一个单独对我有效。
我的解决办法是:
在android清单中使用[android:launchMode=“SingleTop”]
将活动A声明为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();
您可以使用此示例从活动C
调用您的活动A
Intent loout=newintent(上下文、LoginActivity.class);
loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
背景。起始触觉(loout)清单中的代码>
android:launchMode="singleTask"
及
使用finishefinity();启动任务A时在任务C中清除后台活动。使用此代码启动新活动并关闭或销毁所有其他活动堆栈或后台堆栈
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
我找到了一个有趣的解决方案,可能会有所帮助。我是在我的onBackPressed()
方法中这样做的
finishAffinity();
finish();
finishafinity
删除现有活动与其堆栈的连接。然后完成帮助您退出该活动。最终将退出应用程序。在kotlin中,它与jav几乎相同
Intent intent = new Intent(this, MainActivity.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.
finishAffinity();
finish();
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
val intent = Intent(this@LoginActivity, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(intent)
finish()
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();
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()
fun Intent.clearStack(additionalFlags: Int = 0) {
flags = additionalFlags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}