完成之前的所有活动

时间:2011-06-13 12:13:45

标签: java android android-activity screen flow

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

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

有没有办法解决这个问题?

27 个答案:

答案 0 :(得分:491)

使用:

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

这将清除主页上的所有活动。

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

我不确定,但您也可以尝试使用此标志登录。我不知道在这种情况下如何订购活动。因此,不知道它是否会清除您所在屏幕下方的屏幕,包括您当前所在的屏幕,但它绝对是最佳选择。

希望这会有所帮助。

答案 1 :(得分:288)

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

答案 2 :(得分:121)

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

finishAffinity();

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

ActivityCompat.finishAffinity(this);

答案 3 :(得分:37)

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

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

上述代码会清除除LoginActivity以外的所有活动。然后将以下代码放在LoginActivity的{​​{1}}中,以便在重新创建onCreate(...)并且传递'EXIT'信号时进行侦听:

LoginActivity

为什么Android中的退出按钮太难了?

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

Android操作系统开发人员希望您的程序能够在意外关机和手机关机后继续运行,当用户重新启动程序时,他们会在他们停止的地方继续运行。因此,用户可以在使用您的应用程序时接听电话,并打开地图,这需要释放您的应用程序以获取更多资源。

当用户恢复您的应用程序时,他们会立即从中断处继续操作而不会中断。此退出按钮正在从活动管理器中篡夺权力,可能会导致自动管理的Android程序生命周期出现问题。

答案 4 :(得分:31)

Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

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

答案 5 :(得分:28)

将以下内容用于活动

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

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

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

答案 6 :(得分:20)

来自developer.android.com

public void finishAffinity ()
     

在API级别16中添加

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

请注意,此结尾不允许您将结果传递给上一个活动,如果您尝试这样做,则会抛出异常。

答案 7 :(得分:16)

我想我迟到了,但答案很简单。 Activity中有一个finishAffinity()方法,它将完成当前活动和所有父活动,但它仅适用于Android 4.1或更高版本。

对于API 16+,请使用

finishAffinity();

对于16岁以下,请使用

ActivityCompat.finishAffinity(YourActivity.this);

希望它有所帮助!

答案 8 :(得分:13)

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

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

这对我有用在最高支付屏幕中删除所有后筹码活动,

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

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

答案 9 :(得分:12)

旁注,很高兴知道
这个答案有效(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);

答案 10 :(得分:10)

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

{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}

答案 11 :(得分: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);
}

答案 12 :(得分:8)

我有同样的问题 您可以使用IntentCompat,如下所示:

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

这段代码对我有用。

Android api 17

答案 13 :(得分: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();

答案 14 :(得分:6)

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

屏幕4(或任何其他)上的

- >

StartActivity(Log in)
FLAG_ACTIVITY_CLEAR_TOP

答案 15 :(得分:6)

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

答案 16 :(得分:6)

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

答案 17 :(得分:5)

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

答案 18 :(得分:4)

就我而言,我在上次活动中使用finishAffinity()函数,例如:

finishAffinity()
startHomeActivity()

希望它会有用。

答案 19 :(得分:3)

当用户点击退出按钮时,请编写以下代码:

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

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

答案 20 :(得分:2)

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

然后在所有转发活动中,使用此功能进行注销:

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

效果很好。

答案 21 :(得分:2)

我想我来晚了,但是答案很简单。 Activity中有一个finishAffinity()方法可以完成当前活动和所有父活动,但仅在Android 4.1或更高版本中有效。

对于API 16+,请使用

finishAffinity();

对于16岁以下的人群,使用

ActivityCompat.finishAffinity(YourActivity.this);

希望有帮助!

shareedit 18年5月27日在8:03回答

Akshay Taru

答案 22 :(得分:1)

如果您在screen 1中登录用户并从那里进入其他屏幕,请使用

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

答案 23 :(得分: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);

答案 24 :(得分:0)

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

finishAffinity()
System.exit(0);

答案 25 :(得分:0)

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

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

答案 26 :(得分: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();
}