完成所有以前的活动
我的应用程序有以下stream程屏幕:
Home->screen 1->screen 2->screen 3->screen 4->screen 5
现在我在每个屏幕上都有一个通用的log out
button
( Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5
)
我希望当用户点击注销button(从任何屏幕),所有的屏幕将完成,一个新的屏幕Log in
将打开。
我已经尝试几乎所有的FLAG_ACTIVITY
来实现这一点。 我也通过一些在计算器中的答案,但无法解决问题。 我的应用程序是在Android 1.6上,所以不能使用FLAG_ACTIVITY_CLEAR_TASK
有什么办法可以解决这个问题吗?
使用:
Intent intent = new Intent(getApplicationContext(), Home.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
这将清除家中的所有活动。
假设当用户login并创buildhome时,您将完成login屏幕,然后在该顶部创build1到5的所有屏幕。 我发布的代码将返回到主屏幕完成所有其他活动。 你可以添加一个额外的意图,并阅读在主屏幕上的活动,并完成它(也许启动login屏幕再次从那里或某事)。
我不知道,但你也可以试着用这个标志login。 在这种情况下,我不知道如何下令进行活动。 所以不知道是否会清除屏幕下方的屏幕,包括您目前正在使用的屏幕,但是它绝对是您要走的路。
希望这可以帮助。
您可以尝试Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK
。 它将完全清除以前的所有活动并开始新的活动。
在启动新的活动之前,只需添加以下代码:
finishAffinity();
或者,如果你想让它在以前的Android版本中工作:
ActivityCompat.finishAffinity(this);
当用户希望退出所有打开的活动时 ,他们应该按下一个button,加载应用程序启动时运行的第一个活动,清除所有其他活动,然后完成最后一个活动。 当用户按下退出button时,运行以下代码。 在我的情况下, LoginActivity
是我的程序运行的第一个活动。
Intent intent = new Intent(getApplicationContext(), LoginActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra("EXIT", true); startActivity(intent);
以上代码清除除LoginActivity
之外的所有活动。 然后将下面的代码放在LoginActivity
的onCreate(...)
,以便监听何时重新创buildLoginActivity
并传递了“EXIT”信号:
if (getIntent().getBooleanExtra("EXIT", false)) { finish(); }
为什么在Android上制作退出button非常困难?
Android会尽力阻止你在应用程序中有一个“退出”button,因为他们希望用户不要在意他们使用的程序是否在后台运行。
Android操作系统的开发人员希望你的程序能够在意外关机和电话closures的情况下继续下去,当用户重新启动程序时,他们可以在停止的地方继续。 因此,用户在使用应用程序时可以接听电话,并打开需要释放应用程序才能获取更多资源的地图。
当用户恢复您的应用程序时,他们会在没有中断的情况下正确地继续。 这个退出button是篡夺活动pipe理器的权力,可能会导致自动pipe理的android程序生命周期的问题。
Intent intent = new Intent(this, classObject); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent);
这将适用于所有Android版本。 Android支持库中添加了IntentCompat
类。
使用以下活动
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中添加
在当前任务中完成此活动以及紧接其下的所有活动中具有相同亲和力的活动。 这通常用于应用程序可以启动到另一个任务(例如从可理解的内容types的ACTION_VIEW),用户已经使用向上导航切换出当前任务并进入自己的任务。 在这种情况下,如果用户已经导航到第二个应用程序的任何其他活动,那么所有这些应该作为任务切换的一部分从原始任务中移除。
请注意,此结束不允许您将结果传递到上一个活动,如果您正在尝试这样做,则会抛出exception。
我为此实现了一个解决scheme(我认为我在Stack Overflow的某个地方find了它,但是我不记得了,所以首先要感谢谁这么做):
从你的任何活动做到这一点:
// 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); }
对于应用程序最后一个屏幕上的注销button,在注销button监听器上使用此代码完成所有打开的以前的活动,并解决您的问题。
{ Intent intent = new Intent(this, loginScreen.class); ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); }
我有同样的问题,你可以使用IntentCompat
,像这样:
import android.support.v4.content.IntentCompat; intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
这个代码适合我。
Android的API 17
如果你的应用程序的最低版本是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();
login – >主页 – >屏幕1->屏幕2->屏幕3->屏幕4->屏幕5
在屏幕4(或任何其他) – >
StartActivity(login)
同
FLAG_ACTIVITY_CLEAR_TOP
如果在以前的活动中使用startActivityForResult()
,只需重写OnActivityResult()
并调用finish();
它在所有的活动中的方法..这将做的工作…
API> = 15到API 23简单的解决scheme。
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);
在旁边注意,很高兴知道
这个答案有效( 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()
replace任何以前的标志 ,并且.addFlags()
不附加任何新的标志。
所以这也会起作用
Intent intent = new Intent(getApplicationContext(), LoginActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
当用户点击注销button,然后写下面的代码:
Intent intent = new Intent(this, LoginActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
而且当你login后,如果你调用新的活动,不要使用finish();
如果您在screen 1
login用户,并从那里进入其他屏幕,请使用
Intent intent = new Intent(this, Screen1.class); intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
简单地说,当你从login屏幕去,而不是当完成login屏幕。
然后在所有的转发活动中,使用这个注销:
final Intent intent = new Intent(getBaseContext(), LoginScreen.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); context.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);
我发现这个解决scheme可以在每个设备上工作,尽pipeAPI级别(即使是<11)
Intent intent = new Intent(getApplicationContext(), LoginActivity.class); ComponentName cn = intent.getComponent(); Intent mainIntent = IntentCompat.makeRestartActivityTask(cn); startActivity(mainIntent);
尝试这个
-
适用于所有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();
-
以上API 11
finishAffinity();