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

时间:2012-10-18 05:48:29

标签: android back-stack

当我点击个人资料活动中的退出按钮时,我想将用户带到登录页面,他需要在哪里使用新功能凭证。

因此我使用了这段代码:

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

但问题是当我点击登录活动上的设备后退按钮时,它会将我带到ProfileActivity。当我按下LoginActivity上的设备后退按钮时,我希望应用程序关闭。

我做错了什么?

我还在 LoginActivity

的清单中添加了android:launchMode="singleTop"

谢谢

17 个答案:

答案 0 :(得分:253)

提议的解决方案here为我工作:

爪哇

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(OldActivity.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。

答案 1 :(得分:31)

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

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

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

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

setResult(RESULT_CLOSE_ALL);
finish();

RESULT_CLOSE_ALL是一个最终的全局变量,带有一个唯一的整数,表示您要关闭所有活动。

然后定义每个活动的onActivityResult(...)回调,这样当活动返回RESULT_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的方式不是为了使用它而设计的。

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

On logout, clear Activity history stack, preventing "back" button from opening logged-in-only Activites

其他方法也参见这些主题:

Android: Clear the back stack

Finish all previous activities

答案 2 :(得分:17)

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

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

这不仅可以创建一个新的,干净的任务堆栈,还可以实现" up"如果您的LoginActivity有父活动,请按此按钮。

答案 3 :(得分:13)

API 16中添加了

finishAffinity()。在以前的版本中使用ActivityCompat.finishAffinity()。当您使用intent启动任何活动并完成当前活动时。现在使用ActivityCompat.finishAffinity()代替finish()。它将完成当前活动以下的所有堆叠活动。它对我来说很好。

答案 4 :(得分:10)

什么对我有用

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

答案 5 :(得分:5)

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

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

答案 6 :(得分:4)

我建议您使用 ProfileActivity 的清单中添加android:launchMode="singleTop"的一种可能解决方案。点击退出时,您可以注销 再次启动 LoginActivity。 注销时你可以打电话给这个。

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

答案 7 :(得分:3)

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

答案 8 :(得分:2)

我也面临同样的问题..

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

    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再次启动: - /我正在使用标志 < / p>

android:LaunchMode:singleTask 
MainActivity

答案 9 :(得分:2)

activity

使用以下内容
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

删除 CLEAR_TASK 标志以供片段使用。

我希望这可以用于某些人。

答案 10 :(得分:1)

保持

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

答案 11 :(得分:1)

试试这个会起作用:

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

答案 12 :(得分:1)

没有任何意图标志对我有用,但这是我修复它的方式:

当用户从一个活动中退出时,我必须从该活动广播一条消息,然后在我想要关闭的活动中接收它,之后我调用finish();它运作得很好。

答案 13 :(得分:1)

在API级别11或更高级别中,在Intent上使用function changeScriptSrc() { var scripts = document.getElementsByTagName("script"); for ( var i = 0; i < scripts.length; ++ i ) { if ( scripts [i].src = "myfile1.js" ) { scripts [i].src = "new js file path"; break; } } } <button onclick="changeScriptSrc();">Change Script Src</button> FLAG_ACTIVITY_CLEAR_TASK标志清除所有活动堆栈。

FLAG_ACTIVITY_NEW_TASK

答案 14 :(得分:0)

使用此

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

答案 15 :(得分:0)

添加到清单以进行您的活动android:launchMode="singleTask"

答案 16 :(得分:0)

高级可重复使用的Kotlin:

您可以使用setter方法直接设置标志。在Kotlin中,or是Java的replacement按位或|

intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK

如果您打算定期使用此功能,请创建一个Intent扩展功能

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
}