Android从后堆栈中删除活动


73

好的,所以我对如何处理此事感到困惑。所以我有了MainActivity,可以从那里将一个Activity启动到DegreePlanActivity,然后从那里可以将另一个Activity启动到EditDegreePlan。我在AndroidManifest中将EditDegreePlan设置为noHistory。问题是在他们保存EditDegreePlan之后,它将启动一个Activity到DegreePlan。因此,如果用户按Back,则必须按两次以再次进入MainActivity。我想摆脱它,所以他们只需要按下一次即可。不过,我对如何执行此操作感到困惑。

如果我将DegreePlanActivity设置为noHistory,则他们在EditDegreePlan中无法按Back。

我尝试覆盖onBackPressed方法并启动MainActivity的意图。然后的问题是,他们必须多次按Back才能退出应用程序。

我该怎么办?


14
在startActivity方法之后写finish()
Md Abdul Gafur

Answers:


143

FLAG_ACTIVITY_CLEAR_TOP清除您的“活动”堆栈,您可以使用以下代码:

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

请记住,此标志仅清除中间活动,例如,如果您具有A,B,C,Back Stack然后使用该标志从C活动转到D,则不会清除Back Stack,并且堆栈将为A,B,C,D,但是如果您使用此标志从活动D转到活动A,B,C,D活动将从堆栈中弹出,而后向堆栈中只有A。


谢谢!那很好。我什至可以从AndroidManifest中删除noHistory。只需将一行代码添加到EditDegreePlanActivity的save方法即可修复所有问题。
Emrys90

1
如何使用taskAffinity =“”来进行这些活动;?
ralphgabb

哇,这是个很棒的功能。我不敢相信它能满足我的需求。我有一个后台异步服务,可以扫描条形码。然后在特定的条形码上开始一些活动。在某些情况下,我需要从堆栈中删除一些启动的活动。这很好用!
Marek

很好的解释!
iamkdblue

14

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

1
太棒了!Thnx为当前的东西。

3
非常感谢,但是不建议使用IntentCompat.FLAG_ACTIVITY_CLEAR_TASK,请改用Intent.FLAG_ACTIVITY_CLEAR_TASK
Akshatha Srinivas

13

我建议您startActivityForResult()(而不是简单地startActivity())在启动EditDegreePlan-Activity时使用,如Android教程中所述

然后在EditDegreePlan-Activity中调用

setResult(RESULT_OK);
finish();

如果您不希望从EditDegreePlan-Activity获得任何数据,则不必实现onActivityResult


1
不可思议的主意!我的用例:一个简单的登录活动(可能导致注册活动,与用户流程无缝连接),完成登录后,打开功能活动。如果用户回击,它应该显示我的第一个活动(触发登录的活动)。解决方法:现在使用调用登录和注册活动startActivityForResult。完成后,它们就没有了。谢谢!
danguilherme

7

似乎,如果您根本不指定任何标志,则将获得所需的行为。后退按钮将做正确的事情。要从代码中关闭活动,请使用finish()与用户按下“后退”按钮具有相同效果的方法。因此,当您完成EditDegreePlan时,您将自动到达DegreePlan,而无需调用任何Intents一个。


7

要从清单清单中的后堆栈中删除活动,请添加 android:noHistory="true"到清单文件中的活动中。

请参阅下面的示例。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.activity"
      android:versionCode="1"
      android:versionName="1.0">
 <application android:name="MyApp" android:label="My Application">
    <activity android:name=".LoginActivity" 
      android:noHistory="true"> //add this line to your activity inside manifest
     <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
   </activity>
 </application>
</manifest>

对于启动屏幕特别有用-配置总是比代码更好
GreyBeardedGeek

6

您可以在开始新活动之前致电完成。这将从堆栈中删除当前活动,因此当您在下一个活动中按“后退”按钮时,不会从堆栈历史记录中调用第一个活动。

Intent i = new Intent(MainActivity.this, NextActivity.class);
finish();  
startActivity(i);

1
无论您在startActivity()之前还是之后调用它,都不会进行任何首次活动
Makarand

5

这是您的流程:

MainActivity-> DegreePlanActivty-> EditDegreePlan-> DegreePlan-> MainActivty

在您的“ DegreePlan”中覆盖这些方法

public void onBackPressed() {
   super.onBackPressed();
   Intent goToMainActivity = new Intent(getApplicationContext(), MainActivity.class);
   goToMainActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // Will clear out your activity history stack till now
   startActivity(goToMainActivity);
}



0

您可以按如下所示添加标志并启动Activity,请尝试以下代码

Intent i = new Intent(activity, Payment.class);
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TOP);
activity.startActivity(i);

0
This code should help you out: It is in Kotlin
private fun verifyIfUserIsLoggedIn(){
        val uid = FirebaseAuth.getInstance().uid
        if(uid== null){
            val intent = Intent(this, MainActivity::class.java)
            intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
            startActivity(intent)
        }
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.