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

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

因此我使用了这个代码:

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

在注销按钮的 onButtonClick中。

但问题是,当我单击 Login Activity 上的设备返回按钮时,它会将我带到 ProfileActivity。当我按下 LoginActivity 上的设备返回按钮时,我希望应用程序应该关闭。

我做错了什么?

我还为我的 登入活动在清单中添加了 android:launchMode="singleTop"

谢谢你

175618 次浏览

一个可能的解决方案,我可以建议你是为我的 个人资料活动增加 android:launchMode="singleTop"的清单。当注销被点击时,你可以 下线 < em > 重新开始,你 < strong > LoginActivity。 你可以称之为。

Intent in = new Intent(Profile.this,Login.class);
in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(in);
finish();

留着吧

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

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

每次你开始一个活动,像这样开始:

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

当你想关闭整个应用程序时,这样做:

setResult(RESULT_CLOSE_ALL);
finish();

REST _ CLOSE _ ALL 是一个最终的全局变量,带有一个唯一的整数,用于表示要关闭所有活动。

然后定义每个活动的 onActivityResult(...)回调函数,这样,当一个活动返回 REST _ CLOSE _ ALL 值时,它也会调用 finish():

@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的方式并不是为了被使用而设计的。

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

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

查看这些线程以获得其他方法:

安卓: 清除后面的栈

完成以前的所有活动

我也面临着同样的问题。

在登录活动中,我所做的是。

    Intent myIntent = new Intent(MainActivity.this, ActivityLoggedIn.class);
finish();
MainActivity.this.startActivity(myIntent);

注销

   Intent myIntent = new Intent(ActivityLoggedIn.this, MainActivity.class);
finish();
ActivityLoggedIn.this.startActivity(myIntent);

这个工作得很好,但是当我在 ActivityLoggedIn 中,我最小化应用程序并点击应用程序抽屉上的启动按钮图标,MainActivity 再次启动:-/我正在使用标志

android:LaunchMode:singleTask

主要活动。

对我有用的东西

Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);

提出的 给你解决方案对我很有效:

爪哇咖啡

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 级别 > = 11。

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

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

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

对于 API 11 + ,你可以这样使用 Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK:

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

它将完全清除所有以前的活动,并开始新的活动。

对于 activity,请使用以下代码

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

删除片段使用的 任务完成标志。

我希望这个可以用在一些人身上。

用这个

Intent i1=new Intent(getApplicationContext(),StartUp_Page.class);
i1.setAction(Intent.ACTION_MAIN);
i1.addCategory(Intent.CATEGORY_HOME);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i1);
finish();

在 API 级别11或更高的情况下,在意图上使用 FLAG_ACTIVITY_CLEAR_TASKFLAG_ACTIVITY_NEW_TASK标志来清除所有活动堆栈。

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);

你可以试试 finishAffinity(),它会关闭所有当前的活动,并在 Android 4.1及以上版本上运行

在 API 16中加入 finishAffinity()。在以前的版本中使用 ActivityCompat.finishAffinity()。当您使用意图启动任何活动并完成当前活动时。现在使用 ActivityCompat.finishAffinity()代替 finish()。它将完成所有堆叠的活动低于当前的活动。我觉得挺好的。

所有的意图标志对我都不起作用,但我是这样修复它的:

当用户从一个活动中注销时,我必须从该活动中广播一条消息,然后在我想要关闭的活动中接收该消息,然后调用 Finish () ; 它工作得非常好。

试试这个,它会奏效的:

Intent logout_intent = new Intent(DashboardActivity.this, LoginActivity.class);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(logout_intent);
finish();

为活动 android:launchMode="singleTask"添加到 Manifest

高级,可重复使用的 Kotlin:

您可以使用 setter 方法直接设置标志。在 Kotlin,or是指代表 Java 按位或 |替代品

intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.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
}

您可以使用以下方法

    fun signOut(context: Context) {
try {
val intent = Intent(context, SplashActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
context.startActivity(intent)
(context as Activity).finishAffinity()
}
} catch (e: Exception) {
LogUtils.logE("EXCEPTION", e)
}


}