当前位置: 首页 > 知识库问答 >
问题:

Android:删除所有以前的活动从后面的堆栈

闻华容
2023-03-14

当我在我的个人资料活动中点击注销按钮时,我想把用户带到登录页面,在那里他需要使用新的凭证。

所以我用了这个代码

Intent intent = new Intent(ProfileActivity.this,
        LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

on按钮中,单击注销按钮的

但问题是,当我点击登录活动上的设备返回按钮时,它会把我带到Profile活动。我期待的应用程序应该关闭时,我按下设备返回按钮上的登录活动。

我做错了什么?

我还在清单中为我的登录活动添加了android:launchMode=“singleTop”

非常感谢。

共有3个答案

洪弘亮
2023-03-14

要完全清除活动堆栈,您需要使用TaskStackBuilder创建新的任务堆栈,例如:

Intent loginIntent = LoginActivity.getIntent(context);
TaskStackBuilder.create(context).addNextIntentWithParentStack(loginIntent).startActivities();

这不仅将创建一个新的、干净的任务堆栈,如果您的LoginActivity有父活动,它还将允许“向上”按钮正常工作。

姜志行
2023-03-14

这里有一个解决方案,可以在使用注销按钮时清除应用程序的所有活动。

每次启动活动时,请按以下方式启动:

Intent myIntent = new Intent(getBaseContext(), YourNewActivity.class);
startActivityForResult(myIntent, 0);

如果要关闭整个应用程序,请执行以下操作:

setResult(RESULT_CLOSE_ALL);
finish();

结果_CLOSE _ALL是最后一个全局变量,带有唯一的整数,表示要关闭所有活动。

然后定义每个活动的onActivityResult(...)回调,这样当一个活动返回RESULT_CLOSE_ALL值时,它也调用over()

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(resultCode)
    {
    case RESULT_CLOSE_ALL:
        setResult(RESULT_CLOSE_ALL);
        finish();
    }
    super.onActivityResult(requestCode, resultCode, data);
}

这将导致级联效应,关闭所有活动。

然而,这是一种黑客行为,它使用的startActivityForResult方式不是设计用来使用的。

也许更好的方法是使用广播接收器,如下所示:

注销时,清除活动历史堆栈,防止“后退”按钮打开仅登录的活动

有关其他方法,请参见以下线程:

Android:清除后栈

完成之前的所有活动

洪飞鸿
2023-03-14

这里提出的解决方案对我有效:

Intent i = new Intent(OldActivity.this, NewActivity.class);
// set the new task and clear flags
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
val i = Intent(this, NewActivity::class.java)
// set the new task and clear flags
i.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
startActivity(i)

但是,它需要API级别

 类似资料:
  • 好吧,所以我有点困惑该怎么处理这个。因此,我有了主活动,从那里可以启动一个活动到DegreePlan活动,从那里可以启动另一个活动到EditDegreeplan。我已经将EditDegreeplan设置为在Android清单中没有历史记录。问题是在他们保存EditDegreeplan后,它会启动一个活动到Degreeplan。因此,如果用户按下后退键,他们必须按两次才能再次进入主活动。我想摆脱它,

  • 假设我有以下层次结构: 1级活动(例如主菜单) 2级活动(如日历) 3级活动(如日历日) 存在以下用例: 深入人心 需要以下过渡行为: 用例1 3:我希望旧活动从左侧滑出,新活动从右侧滑入 用例2:我希望旧活动滑出到右侧,新活动滑入到左侧 我尝试了很多方法来使用来实现这一点,但没有一个组合可以正常工作...我被以下内容卡住了: 动画(这些应该正常工作): SlideFromLeftIn: Slid

  • 我希望当用户按下后退按钮时,我的活动从后退堆栈中清晰可见。我正在使用此意图来打开我的活动: 我希望当我按下后退按钮时,我的OutGoingActivity活动将从堆栈中删除。 每当我启动我的活动时,一个新的活动应该被打开,而不是从堆栈中打开。

  • 问题内容: 我正在尝试转储所有活动线程的列表,包括每个线程的当前堆栈。我可以使用threading.enumerate()获得所有线程的列表,但是我不知道从那里到堆栈的方法。 背景:Zope / Plone应用程序有时会出现故障,消耗100%的cpu,需要重新启动。我觉得这是一个循环,无法正常终止,但是我无法在test- environemt中重现该循环以进行验证。我设法注册了可以从外部触发的信号

  • 前提条件: AndroidQ 问题一: 我在前台有一个视图,当用户单击该视图时,我尝试在android Q中启动一个活动。 以下是我的代码。 它不工作,也不会发生碰撞。我有一些日志。 D ActivityTaskManagerServiceInjector: MIUILOG-权限拒绝活动:意图... 问题2: 我有一个TileService,当用户单击状态栏中的图标时,我尝试启动一个活动 雄激素单

  • 我有一个数组: 我调用它的拼接函数来删除索引之前的所有项: 我只是好奇有没有类似于splice的功能来移除一个索引后的所有项目: 伪码