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

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

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

有帮助吗?

解决方案

采用:

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

这将清除家庭之上的所有活动。

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

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

希望这可以帮助。

其他提示

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

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

finishAffinity();

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

ActivityCompat.finishAffinity(this);

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

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

以上代码清除除了 LoginActivity. 。然后将以下代码放入 LoginActivity' onCreate(...), ,听什么时候 LoginActivity 已重新创建并通过“退出”信号:

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

为什么在Android中进行出口按钮如此之硬?

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

Android OS开发人员希望您的程序能够在手机上的意外关闭和电源下生存,当用户重新启动程序时,他们就可以在停止的地方接下来。因此,用户可以在使用您的应用程序时接收电话,并打开地图,该地图需要您的应用程序释放以获取更多资源。

当用户恢复您的应用程序时,他们会在没有中断的情况下接下来。此退出按钮是从活动经理中篡夺功率,可能会导致自动管理的Android计划生命周期问题。

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

这将适用于所有Android版本。在哪里 IntentCompat 在Android支持库中添加的课程。

使用以下活动

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

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

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

developer.android.com:

public void finishAffinity ()

在API级别16中添加

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

请注意,此完成不允许您为上一个活动提供结果,如果您尝试这样做,将会抛出例外。

我想我迟到了,但是有简单而简短的答案。活动中有一种终点()方法,它将完成当前活动和所有父活动,但仅在Android 4.1或更高的情况下起作用。

对于API 16+,请使用

finishAffinity();

对于16岁以下,请使用

ActivityCompat.finishAffinity(YourActivity.this);

希望能帮助到你!

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

如果您的应用程序具有最低SDK版本16,则可以使用 终点()

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

这对我来说是最高付款屏幕上的工作

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

http://developer.android.com/reference/android/app/activity.html#finishaffinity%28%29

我为此实施了一种解决方案(我认为我在某个地方的堆栈溢出中发现了它,但我不记得了,所以感谢任何人首先这样做):

您的任何活动都可以做到这一点:

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

然后在您的登录时,覆盖onkeydown:

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

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

{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
    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();

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

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

该代码对我有用。

Android API 17

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

就我而言,我使用 finishAffinity() 在最后一个活动中的功能如下:

finishAffinity()
startHomeActivity()

希望它将有用。

登录in-> home->屏幕1->屏幕2->屏幕3->屏幕4->屏幕5

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

StartActivity(Log in)
FLAG_ACTIVITY_CLEAR_TOP

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

如果您正在使用 startActivityForResult() 在您以前的活动中,只是覆盖 OnActivityResult() 并致电 finish(); 它在所有活动中内部的方法。这将完成工作...

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

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

而且,登录后,如果您调用新活动,请不使用完成();

简而言之,当您从登录屏幕上移动时,而不是完成登录屏幕时。

然后在所有远期活动中,将其用于注销:

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

它可以很好地工作。

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

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

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

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

我发现尽管API级别,我还是在每个设备上都可以使用这种解决方案(即使<11)

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top