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

Arc*_*pgc 104 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);
Run Code Online (Sandbox Code Playgroud)

在" onButtonClick注销"按钮中.

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

我究竟做错了什么?

我还在LoginActivityandroid:launchMode="singleTop"的清单中添加了

谢谢

kgi*_*kis 269

这里提出的解决方案对我有用.

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);
Run Code Online (Sandbox Code Playgroud)

但是,它需要API级别> = 11.


Anu*_*kur 31

以下是使用注销按钮清除所有应用程序活动的一种解决方案.

每次启动Activity时,都会这样启动:

Intent myIntent = new Intent(getBaseContext(), YourNewActivity.class);
startActivityForResult(myIntent, 0);
Run Code Online (Sandbox Code Playgroud)

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

setResult(RESULT_CLOSE_ALL);
finish();
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

这将导致级联效果,关闭所有活动.

然而,这是一种黑客攻击,并且其使用startActivityForResult方式不是为了使用而设计的.

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

注销时,清除活动历史记录堆栈,阻止"后退"按钮打开仅登录的活动

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

Android:清除后台堆栈

完成之前的所有活动

  • 你有大约30个历史活动是否可行? (4认同)
  • 应该.但如果您在历史上有30项活动,那么您可能需要考虑更改您的设计.30似乎有点太多了,Android可能会自杀它们. (4认同)

Mat*_*ola 17

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

Intent loginIntent = LoginActivity.getIntent(context);
TaskStackBuilder.create(context).addNextIntentWithParentStack(loginIntent).startActivities();
Run Code Online (Sandbox Code Playgroud)

这不仅会创建一个新的,干净的任务堆栈,如果您的LoginActivity具有父活动,它还将允许"up"按钮正常运行.

  • 这是最好的方法。 (2认同)

Anu*_*ava 15

finishAffinity()在API 16中添加.ActivityCompat.finishAffinity()在以前的版本中使用.当您使用intent启动任何活动并完成当前活动时.现在 ActivityCompat.finishAffinity()改用finish().它将完成当前活动以下的所有堆叠活动.这对我来说可以.

  • 它实际上是`ActivityCompat.finishAffinity()` (2认同)

Mon*_*idi 10

什么对我有用

Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
Run Code Online (Sandbox Code Playgroud)


Bun*_*nny 8

您可以尝试finishAffinity(),它会关闭所有当前活动,并且适用于 Android 4.1 及以上版本


And*_*oid 5

我可以建议您的一种可能的解决方案是android:launchMode="singleTop"为我的ProfileActivity添加清单。当单击注销 时,您可以注销重新开始您的LoginActivity。 在注销时,您可以调用它。

Intent in = new Intent(Profile.this,Login.class);
                in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(in);
                finish();
Run Code Online (Sandbox Code Playgroud)


mad*_*adx 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);
Run Code Online (Sandbox Code Playgroud)

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


归档时间:

查看次数:

127057 次

最近记录:

5 年,11 月 前