142

当我在我的个人资料活动中单击注销按钮时,我想将用户带到登录页面,他需要在其中使用新凭据。

因此我使用了这段代码:

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 上的设备后退按钮时,我期待应用程序应该关闭。

我究竟做错了什么?

我还在android:launchMode="singleTop"清单中为我的LoginActivity添加了

谢谢你

4

18 回答 18

357

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

爪哇

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。

于 2014-06-13T12:33:11.473 回答
31

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

每次启动 Activity 时,都像这样启动它:

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以一种并非设计为使用的方式使用。

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

注销时,清除 Activity 历史堆栈,防止“返回”按钮打开仅登录的 Activity

有关其他方法,请参见这些线程:

Android:清除后台堆栈

完成之前的所有活动

于 2012-10-18T08:20:24.703 回答
23

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

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

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

于 2014-09-08T04:56:40.833 回答
18

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

于 2015-12-09T07:26:23.477 回答
10

什么对我有用

Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
于 2014-04-24T10:30:32.410 回答
6

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

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

于 2015-02-24T19:03:10.960 回答
6

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

于 2015-07-11T11:54:40.283 回答
5

我可以建议您的一种可能的解决方案是为我的ProfileActivityandroid:launchMode="singleTop"添加清单。并且当单击注销时,您可以再次注销您的 LoginActivity。 在注销时你可以调用它。

Intent in = new Intent(Profile.this,Login.class);
                in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(in);
                finish();
于 2012-10-18T06:04:32.537 回答
3

使用以下内容activity

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

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

我希望这可能对某些人有用。

于 2015-03-05T10:55:33.683 回答
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 再次启动:-/我正在使用标志

android:LaunchMode:singleTask 

对于 MainActivity。

于 2014-01-17T10:38:21.940 回答
2

没有一个意图标志对我有用,但这是我修复它的方法:

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

于 2017-01-09T09:06:39.533 回答
1

就收下吧

Intent intent = new Intent(ProfileActivity.this,
    LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);
于 2012-10-18T06:07:55.237 回答
1

在 API 级别 11 或更高版本中,使用FLAG_ACTIVITY_CLEAR_TASKFLAG_ACTIVITY_NEW_TASK标记 Intent 以清除所有活动堆栈。

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);
于 2015-07-03T11:04:16.603 回答
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();
于 2017-06-13T04:24:44.737 回答
1

高级、可重用的 Kotlin:

您可以使用 setter 方法直接设置标志。在 Kotlinor中是Java按位或|.

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
}
于 2020-01-09T18:34:46.170 回答
0

为您的活动添加到清单android:launchMode="singleTask"

于 2019-09-12T08:29:03.707 回答
0

您可以使用以下方法

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

    }
于 2021-10-28T12:15:16.027 回答
-1

用这个

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();
于 2015-06-12T06:33:06.703 回答