完成之前的所有活动

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

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

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

352413 次浏览

登录->主界面->界面1->界面2->界面3->界面4->界面5 .单击“确定”

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

StartActivity(登录)
FLAG_ACTIVITY_CLEAR_TOP

如果你在screen 1中登录用户并从那里转到其他屏幕,使用

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

如果你在之前的活动中使用了startActivityForResult(),只需覆盖OnActivityResult()并在所有活动中调用它内部的finish();方法。这就可以了……

使用:

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

这将清除所有的活动在顶部的家。

假设你完成了登录屏幕,当用户登录时,home被创建了,然后所有的屏幕从1到5在那个上面。我发布的代码将返回到主屏幕,完成所有其他活动。你可以在意图中添加额外的内容,并在主屏幕活动中读取并完成它(也许可以从那里再次启动登录屏幕或其他内容)。

我不确定,但你也可以尝试登录这个标志。我不知道在这种情况下活动将如何安排。所以不知道它是否会清除屏幕下面的那些,包括你现在所在的,但这绝对是可行的。

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

简单地说,当您从登录屏幕离开时,而不是在完成登录屏幕时。

然后在所有转发活动中,使用这个来登出:

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

它工作得很完美。

当用户点击登出按钮,然后写以下代码:

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

并且登录后如果调用new activity,不要使用finish();

当用户希望退出所有打开的活动时,他们应该按下一个按钮,当你的应用程序启动时加载第一个运行的活动,清除所有其他活动,然后让最后一个剩余的活动完成。当用户按下退出按钮时,运行以下代码。在我的例子中,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.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK。它将完全清除所有以前的活动,并开始新的活动。

developer.android.com:

public void finishAffinity ()

在API级别16中添加

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

请注意,此结束不允许您向前一个活动交付结果,如果您试图这样做,则会抛出异常。

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

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

这将适用于所有Android版本。其中IntentCompat类添加到Android支持库。

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

finishAffinity();

或者如果你想让它在以前的Android版本中工作:

ActivityCompat.finishAffinity(this);

使用下面的活动

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

删除片段使用的CLEAR_TASK标志。

我希望这对一些人有用。

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

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

这个代码为我工作。

Android api 17

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

我发现这个解决方案可以在每个设备上工作,尽管API级别(甚至是<11)

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

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

对于API >= 15到API 23 简单的解决方案。< / p >

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

我找到了这条路,它会清除所有历史并退出

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);
顺便说一句,很高兴知道
这个答案工作(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);

与其使用finish(),不如使用finishAffinity();

我想我迟到了,但是有一个简单而简短的答案。 Activity中有一个finishAffinity()方法,它将完成当前活动和所有父活动,但它仅在Android 4.1或更高版本中有效

对于API 16+,使用

finishAffinity();

16岁以下使用

ActivityCompat.finishAffinity(YourActivity.this);

希望能有所帮助!

在我的例子中,我在最后一个活动中使用finishAffinity()函数:

finishAffinity()
startHomeActivity()

希望对大家有用。

最好的方法关闭所有以前的活动,并清除内存

finishAffinity()
System.exit(0);

我想我迟到了,但有一个简单而简短的答案。Activity中有一个finishAffinity()方法,它将完成当前活动和所有父活动,但它只能在Android 4.1或更高版本中工作。

对于API 16+,使用

finishAffinity ();

16岁以下使用

ActivityCompat.finishAffinity (YourActivity.this);

希望能有所帮助!

< p > shareedit 回答5月27日'18在8:03

阿卡什Taru

我试了我这边的旗子,还是没用。我有一个设计非常相似的应用程序,我有一个可能的解决方案在逻辑方面。我已经使用共享首选项构建了登录和注销。

如果我登出,数据在我的共享首选项被销毁/删除。

从我的任何活动(如Home.java)中,我检查共享首选项是否有数据,在这种情况下,它不会有数据,因为我从其中一个屏幕注销时销毁了它。因此,逻辑破坏/完成该活动,并将我带回Login活动。您可以在所有其他活动中复制此逻辑。

但是,请记住在onPostResume()中执行这个检查,因为这是当你返回Home.java时调用的

代码示例如下:

@Override
protected void onPostResume() {
SharedPreferences pref = this.getSharedPreferences("user_details", Context.MODE_PRIVATE);
if (pref.getAll().isEmpty()){
//Shared Preferences has no data.
//The data has been deleted
Intent intent = new Intent(getApplicationContext(), Login.class);
startActivity(intent);
finish();
//Finish destroys that activity which in our case is the Home.java
}




super.onPostResume();
}

芬兰湾的科特林中这样写:

在另一个活动中(包含一些类),在Imports

var activity:Activity?=null
get() = field
set(value) {
field = value
}

然后,在onCreate

activity=this

现在在MainActivity中:

activity?.finish()