完成之前的所有活动

Tan*_*dal 345 java android flow screen android-activity

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

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

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

DAr*_*rkO 513

使用:

Intent intent = new Intent(getApplicationContext(), Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

这将清除所有家庭活动.

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

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

希望这可以帮助.

  • 此代码仅清除顶级活动堆栈,用于清除所有活动intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); (23认同)
  • @CommonsWare添加`intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);`对我的活动没有帮助.它没有完成干预活动.当我从登录屏幕按回来时,我可以看到以前的活动.这里是我的代码`Intent intent = new Intent(BaseActivity.this,Login.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent);`. (12认同)
  • 不要将活动声明为`singleInstance`,而应考虑使用`FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP`作为Intent的标志.这将完成干预活动并开始(或回到前台)所需的活动. (10认同)

Kon*_*Ken 296

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

  • 对于前11版本,请使用IntentCompat.FLAG_ACTIVITY_CLEAR_TASK (17认同)
  • 适当的解决方案,但只有API 11+ (11认同)
  • @riwnodennyk 为什么是 API 11+? (2认同)
  • @ono是的.这应该就是你所需要的.确保您的目标活动的启动模式在清单中设置为"singleTask". (2认同)

Hen*_*que 127

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

finishAffinity();
Run Code Online (Sandbox Code Playgroud)

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

ActivityCompat.finishAffinity(this);
Run Code Online (Sandbox Code Playgroud)

  • ActivityCompat.finishAffinity(本); 调用activity.finish()for api <16.所以它不起作用. (11认同)
  • 这仍然是迄今为止 API &gt; 16 的最佳解决方案,因为其他解决方案在清除或重新创建任务时会产生延迟 (2认同)

Eri*_*ski 39

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

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

上面的代码清除除了之外的所有活动LoginActivity.然后将以下代码放入LoginActivitys中onCreate(...),以监听何时LoginActivity重新创建并传递'EXIT'信号:

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();  
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


Gem*_*Gem 31

Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

这适用于所有Android版本.其中IntentCompat的类支持Android库添加.


Ari*_*ael 30

使用以下内容进行活动

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
Run Code Online (Sandbox Code Playgroud)

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

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


小智 21

来自developer.android.com:

public void finishAffinity ()
Run Code Online (Sandbox Code Playgroud)

在API级别16中添加

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

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


Aks*_*aru 19

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

对于API 16+,请使用

finishAffinity();

对于16岁以下,请使用

ActivityCompat.finishAffinity(YourActivity.this);

希望能帮助到你!


Joh*_*ohn 16

在旁注,很高兴知道
这个答案有效(/sf/answers/942807981/)

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
this.finish();
Run Code Online (Sandbox Code Playgroud)

而这不起作用

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

.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);
Run Code Online (Sandbox Code Playgroud)


Jay*_*hit 13

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

完成此活动以及当前任务中具有相同亲缘关系的紧接其下的所有活动.

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

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

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


And*_*ndy 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);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这通常是一个非常糟糕的主意,它可能会起作用,它会引入一个可能在将来破坏的接触点,并且很难调试.我从经验中告诉你:) (3认同)

Amr*_*rit 10

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

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


Adn*_*aki 8

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

import android.support.v4.content.IntentCompat;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
Run Code Online (Sandbox Code Playgroud)

这段代码对我有用.

Android api 17


小智 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();
Run Code Online (Sandbox Code Playgroud)

  • 为什么**FLAG_ACTIVITY_CLEAR_TASK**两次? (5认同)

Hit*_*wah 7

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


小智 7

就我而言,我finishAffinity()在上一个活动中使用了功能,例如:

finishAffinity()
startHomeActivity()
Run Code Online (Sandbox Code Playgroud)

希望它会有用。


Pla*_*lov 6

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

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

StartActivity(Log in)
FLAG_ACTIVITY_CLEAR_TOP

  • 当我按下后退按钮时,所有先前的活动都按照它们的顺序显示.这些活动需要关闭,当点击注销按钮时,堆栈中只有一个活动,这将是登录活动.没有登录屏幕.用户从主屏幕开始. (2认同)

Kam*_*kar 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);
Run Code Online (Sandbox Code Playgroud)


nge*_*esh 5

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