首页 文章

完成之前的所有活动

提问于
浏览
312

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

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

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

24 回答

  • 12

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

  • 8

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

  • 7

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

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

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

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

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

  • 6

    使用以下内容进行活动

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

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

    我希望这可能对一些人有用 .

  • 5

    简单地说,当您从登录屏幕进入时,而不是在完成登录屏幕时 .

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

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

    它完美地运作 .

  • 11
    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();
    
  • 3

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

    对于API 16,请使用

    finishAffinity();

    对于16岁以下,请使用

    ActivityCompat.finishAffinity(YourActivity.this);

    希望能帮助到你!

  • 277

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

    使用:

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

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

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

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

    希望这可以帮助 .

  • 0

    来自developer.android.com

    public void finishAffinity()
    在API级别16中添加

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

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

  • 10

    另一方面,很高兴知道
    这个答案有效(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() replaces any previous flags 并且在 .addFlags() 时不附加任何新标记 .

    所以这也会奏效

    Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
    
  • 1

    我为此实现了一个解决方案(我想我在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);
    }
    
  • 18

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

    finishAffinity();
    

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

    ActivityCompat.finishAffinity(this);
    
  • 0

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

  • 476

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

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

    如果您的应用程序具有最低sdk版本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

  • 37

    我发现这样,它将清除所有历史并退出

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

    在我的情况下,我在上一个活动中使用 finishAffinity() 函数,如:

    finishAffinity()
    startHomeActivity()
    

    希望它会有用 .

  • 5

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

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

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

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

    StartActivity(Log in)
    

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

    这会工作适用于所有Android版本 . IntentCompat 这个类在Android支持库中添加了 .

  • 30

    When the user wishes to exit all open activities ,他们应该按下一个按钮,该按钮加载应用程序启动时运行的第一个Activity,清除所有其他活动,然后完成最后剩余的活动 . 当用户按下退出按钮时,运行以下代码 . 就我而言, 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();  
    }
    

    Why is making an exit button in Android so hard?

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

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

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

  • 112

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

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

    这段代码对我有用 .

    Android api 17

相关问题