406

我的应用程序具有以下流程屏幕:

Home->screen 1->screen 2->screen 3->screen 4->screen 5

现在我log out 在每个屏幕上都有一个通用按钮

( Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5)

我希望当用户单击注销按钮(从任何屏幕)时,所有屏幕都将完成并Log in打开一个新屏幕。

我已经尝试了几乎所有FLAG_ACTIVITY方法来实现这一点。我也在stackoverflow中查看了一些答案,但无法解决问题。我的应用程序在 Android 1.6 上,因此无法使用FLAG_ACTIVITY_CLEAR_TASK

有什么办法可以解决这个问题吗?

4

27 回答 27

585

采用:

Intent intent = new Intent(getApplicationContext(), Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

这将清除家庭顶部的所有活动。

假设您在用户登录并创建主页时完成登录屏幕,然后在该屏幕之上从 1 到 5 的所有屏幕。我发布的代码将使您返回主屏幕,完成所有其他活动。您可以在意图中添加额外内容并在主屏幕活动中阅读并完成它(也许从那里再次启动登录屏幕或其他东西)。

我不确定,但您也可以尝试使用此标志登录。我不知道在这种情况下如何安排活动。所以不知道它是否会清除您正在使用的屏幕下方的内容,包括您当前正在使用的内容,但这绝对是要走的路。

于 2011-06-13T12:33:52.000 回答
336

你可以试试Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK。它将完全清除所有以前的活动并开始新的活动。

于 2012-11-20T07:47:29.487 回答
149

在启动新 Activity 之前,只需添加以下代码:

finishAffinity();

或者,如果您希望它在以前的 Android 版本中工作:

ActivityCompat.finishAffinity(this);
于 2014-07-29T13:11:05.367 回答
39

当用户希望退出所有打开的活动时,他们应该按下一个按钮,加载应用程序启动时运行的第一个活动,清除所有其他活动,然后完成最后一个剩余活动。当用户按下退出按钮时,运行以下代码。就我而言,LoginActivity是我的程序中运行的第一个活动。

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

上面的代码清除了除LoginActivity. 然后将以下代码放入LoginActivity'sonCreate(...)中,以监听何时LoginActivity重新创建以及传递了 'EXIT' 信号:

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();  
}

为什么在 Android 中制作退出按钮如此困难?

Android 努力阻止您在应用程序中使用“退出”按钮,因为他们希望用户永远不会关心他们使用的程序是否在后台运行。

Android OS 开发人员希望您的程序能够在手机意外关机和断电的情况下幸存下来,并且当用户重新启动程序时,他们会从上次中断的地方继续。因此,用户可以在使用您的应用程序时接听电话,并打开需要释放您的应用程序以获取更多资源的地图。

当用户恢复您的应用程序时,他们会从上次中断的地方继续,不会中断。这个退出按钮正在篡夺活动管理器的权力,可能会导致自动管理的 android 程序生命周期出现问题。

于 2012-05-02T04:19:56.967 回答
33

我想我迟到了,但有一个简单而简短的答案。Activity中有一个finishAffinity()方法可以完成当前Activity和所有父Activity,但它只适用于Android 4.1或更高版本。

对于 API 16+,请使用

finishAffinity();

对于 16 岁以下,使用

ActivityCompat.finishAffinity(YourActivity.this);

希望能帮助到你!

于 2018-05-27T08:03:08.447 回答
31
Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

这适用于所有 Android 版本。在IntentCompatAndroid 支持库中添加的类。

于 2014-05-23T08:16:56.097 回答
30

使用以下活动

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

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

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

于 2015-03-05T10:54:17.427 回答
23

附带说明一下,很高兴知道
这个答案有效(https://stackoverflow.com/a/13468685/7034327

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

而这不起作用

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

.setFlags() 替换任何以前的标志,并且不附加任何新标志.addFlags()

所以这也可以

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
于 2017-04-29T07:33:57.367 回答
21

来自developer.android.com

public void finishAffinity ()

在 API 级别 16 中添加

在当前任务中完成此活动以及紧接其下的所有具有相同亲和力的活动。这通常在应用程序可以启动到另一个任务时使用(例如从它理解的内容类型的 ACTION_VIEW)并且用户已经使用向上导航切换出当前任务并进入它自己的任务。在这种情况下,如果用户向下导航到第二个应用程序的任何其他活动,则所有这些活动都应作为任务切换的一部分从原始任务中删除。

请注意,此完成不允许您将结果传递给先前的活动,如果您尝试这样做,则会引发异常。

于 2012-11-28T12:04:39.513 回答
15

如果您的应用程序具有最低 sdk 版本 16,那么您可以使用finishAffinity()

在当前任务中完成此活动以及紧接其下的所有具有相同亲和力的活动。

这对我有用 在 Top Payment 屏幕中删除所有后台活动,

@Override
public void onBackPressed() {
         finishAffinity();
        startActivity(new Intent(PaymentDoneActivity.this,Home.class));
    } 

http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29

于 2016-07-03T09:50:17.183 回答
11

就我而言,我finishAffinity()在最后一个活动中使用函数,例如:

finishAffinity()
startHomeActivity()

希望它会有用。

于 2018-11-22T22:18:02.240 回答
10

我为此实施了一个解决方案(我想我在某个地方的 Stack Overflow 上找到了它,但我不记得了,所以感谢首先这样做的人):

从您的任何活动中执行以下操作:

// Clear your session, remove preferences, etc.
Intent intent  = new Intent(getBaseContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

然后在您的 LoginActivity 中,覆盖 onKeyDown:

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
于 2011-09-23T06:13:49.097 回答
10

对于应用程序最后一个屏幕上的注销按钮,在注销按钮侦听器上使用此代码来完成所有打开的先前活动,您的问题就解决了。

{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
于 2013-11-26T10:44:47.847 回答
8

我有同样的问题,你可以使用IntentCompat,像这样:

import android.support.v4.content.IntentCompat;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

这段代码对我有用。

安卓 API 17

于 2015-03-05T11:57:33.510 回答
8
    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:15:08.110 回答
8

而不是finish()只使用finishAffinity();

于 2018-05-19T05:16:44.167 回答
6

登录->首页->屏幕1->屏幕2->屏幕3->屏幕4->屏幕5

在屏幕 4(或任何其他)->

开始活动(登录)
FLAG_ACTIVITY_CLEAR_TOP

于 2011-06-13T12:19:59.070 回答
6

对于 API >= 15 到 API 23 的简单解决方案。

 Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
 nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
 startActivity(nextScreen);
 ActivityCompat.finishAffinity(currentActivity.this);
于 2016-11-04T17:52:23.003 回答
5

如果您在以前的活动中使用,只需在所有活动中startActivityForResult()覆盖OnActivityResult()并调用其中的方法。这将完成这项工作......finish();

于 2011-06-13T12:25:21.803 回答
3

当用户单击注销按钮时,请编写以下代码:

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

并且在登录后,如果您调用新活动,请不要使用 finish();

于 2012-03-28T11:48:42.000 回答
3

我想我迟到了,但有一个简单而简短的答案。Activity中有一个finishAffinity()方法可以完成当前Activity和所有父Activity,但它只适用于Android 4.1或更高版本。

对于 API 16+,请使用

完成亲和力();

对于 16 岁以下,使用

ActivityCompat.finishAffinity(YourActivity.this);

希望能帮助到你!

shareedit 于 2018 年 5 月 27 日 8:03 回答

阿克谢·塔鲁

于 2020-03-25T23:11:44.933 回答
2

简单地说,当您从登录屏幕离开时,而不是在完成登录屏幕时。

然后在所有转发活动中,使用它来注销:

final Intent intent = new Intent(getBaseContext(), LoginScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);

它完美地工作。

于 2012-01-24T13:36:23.993 回答
1

如果您登录用户screen 1并从那里转到其他屏幕,请使用

Intent intent = new Intent(this, Screen1.class);
intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
于 2011-06-13T12:23:36.400 回答
1

我找到了这种方式,它将清除所有历史记录并退出

Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
Intent intent = new Intent(getApplicationContext(), SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

finish();
System.exit(0);
于 2016-12-10T19:03:32.140 回答
0

尽管 API 级别(即使 < 11),我发现此解决方案适用于所有设备

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
于 2016-06-05T08:22:56.893 回答
0

关闭所有以前的活动并清除内存的最佳方法

finishAffinity()
System.exit(0);
于 2020-03-06T10:04:16.170 回答
0

我已经尝试了我的标志,但仍然没有工作。我有一个设计非常相似的应用程序,并且在逻辑方面我有一个可能的解决方案。我已经使用共享首选项构建了我的登录和注销。

如果我注销,我的共享首选项中的数据将被销毁/删除。

从我的任何活动(例如 Home.java)中,我检查共享首选项是否有数据,在这种情况下它不会,因为我在从其中一个屏幕注销时销毁了它。因此,逻辑会破坏/完成该活动并将我带回登录活动。您可以在所有其他活动中复制此逻辑。

但是请记住在 onPostResume() 中执行此检查,因为这是您返回 Home.java 时调用的内容

下面的代码示例:

@Override
protected void onPostResume() {
    SharedPreferences pref = this.getSharedPreferences("user_details", Context.MODE_PRIVATE);
    if (pref.getAll().isEmpty()){
        //Shared Preferences has no data.
        //The data has been deleted
        Intent intent = new Intent(getApplicationContext(), Login.class);
        startActivity(intent);
        finish();
        //Finish destroys that activity which in our case is the Home.java
    }


    super.onPostResume();
}
于 2021-06-07T12:27:52.920 回答