完成所有以前的活动 [java]


Answers

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

Question

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

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来实现这一点。 我也通过一些在计算器中的答案,但无法解决问题。 我的应用程序是在Android 1.6上,所以不能使用FLAG_ACTIVITY_CLEAR_TASK

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




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

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

上面的代码清除了除LoginActivity之外的所有活动。 然后将下面的代码放在LoginActivityonCreate(...) ,以便监听何时重新创建LoginActivity并传递了“EXIT”信号:

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

为什么在Android上制作退出按钮非常困难?

Android会尽力阻止你在应用程序中有一个“退出”按钮,因为他们希望用户不要在意他们使用的程序是否在后台运行。

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

当用户恢复你的应用程序时,他们可以在没有中断的情况下正确地停止。 这个退出按钮是篡夺活动管理器的权力,可能会导致自动管理的android程序生命周期的问题。




使用以下活动

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

删除用于片段的CLEAR_TASK标志。

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




我为此实现了一个解决方案(我认为我在的某个地方找到了它,但是我不记得了,所以首先要感谢谁这么做):

从你的任何活动做到这一点:

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



如果你的应用程序的最低版本是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




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



如果在以前的活动中使用startActivityForResult() ,只需重写OnActivityResult()并调用finish(); 它在所有的活动中的方法..这将做的工作...




在旁边注意,很高兴知道
这个答案有效( https://.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);



如果您在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);



尝试这个

  1. 适用于所有API版本

    Intent intent = new Intent(this, "Your_Class_name".class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | 
    Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(intent);
            finish();
  2. 以上API 11

    finishAffinity();