【问题标题】:Android remove Activity from back stackAndroid从后台堆栈中删除活动
【发布时间】:2012-12-16 05:45:25
【问题描述】:

好的,所以我有点不知道如何处理这个问题。所以我有 MainActivity,可以从那里启动一个 Activity 到 DegreePlanActivity,然后从那里启动另一个 Activity 到 EditDegreePlan。我在 AndroidManifest 中将 EditDegreePlan 设置为 noHistory。问题是在他们保存 EditDegreePlan 后,它会向 DegreePlan 启动一个活动。因此,如果用户按 Back,他们必须按两次才能再次进入 MainActivity。我想摆脱它,所以他们只需要按一次。不过,我对如何做到这一点感到困惑。

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

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

我该怎么办?

【问题讨论】:

  • 在startActivity方法之后写finish()

标签: android stack


【解决方案1】:

FLAG_ACTIVITY_CLEAR_TOP清空你的Activity栈,你可以使用下面的代码:

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

请记住,此标志仅清除中间活动,例如,如果您的 Back Stack 中有 A、B、C,则使用此标志从 C 活动转到 D,这 不会 清除 @987654324 @ 并且堆栈将是 A,B,C,D 但是如果您使用此标志从 Activity D 转到 Activity A ,则 B,C,D 活动将从堆栈中弹出,并且您将只有 A 在 Back Stack 。

【讨论】:

  • 谢谢!那工作得很好。我什至可以从 AndroidManifest 中删除 noHistory。只需将那一行代码添加到 EditDegreePlanActivity 的保存方法即可解决所有问题。
  • 如何使用 taskAffinity = ""; ?
  • 哇,这是一个很棒的功能。我不敢相信它有效并且完全符合我的需求。我有一个扫描条形码的后台异步服务。在特定的条形码上,它会启动一些活动。在某些情况下,我需要从堆栈中删除一些已启动的活动。这简直太棒了!
  • 很好的解释!
【解决方案2】:

看来,如果您根本不指定任何标志,您将获得所需的行为。后退按钮只会做正确的事情。要从您的代码中关闭活动,请使用finish() 方法,它与用户按下后退按钮的效果相同。所以当你完成EditDegreePlan后你会自动到达DegreePlan,也不需要打电话给任何Intents

【讨论】:

  • 不,finish() 有时做不到(startActivity+finish),Activity 还能多活 10 秒
【解决方案3】:

这是您的流程:

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

【讨论】:

    【解决方案4】:

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

    然后在 EditDegreePlan-Activity 中调用

    setResult(RESULT_OK);
    finish();
    

    如果您不希望 EditDegreePlan-Activity 提供任何数据,那么您不一定要实现 onActivityResult

    【讨论】:

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

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

    【讨论】:

    • 太棒了!谢谢最新的东西。
    • 非常感谢,但 IntentCompat.FLAG_ACTIVITY_CLEAR_TASK 已弃用,请改用 Intent.FLAG_ACTIVITY_CLEAR_TASK
    【解决方案6】:

    使用它来清除堆栈:

     menuIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

      • 无论在startActivity()之前还是之后调用,都不会有第一个activity
      【解决方案8】:

      你可以如下添加flags并启动Activity,试试下面的代码

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

      【讨论】:

        【解决方案9】:

        要从清单内的后台堆栈中删除活动,请将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>
        

        【讨论】:

        • 对于闪屏特别有用——配置总是比代码好
        • 即使应用程序进入后台,Activity 也会被销毁
        【解决方案10】:
        Intent intent = new Intent(getContext(), MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
        
        startActivity(intent);
        

        【讨论】:

          【解决方案11】:
          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)
                  }
              }
          

          【讨论】:

            猜你喜欢
            • 2012-10-08
            • 2019-03-20
            • 1970-01-01
            • 2013-08-11
            • 1970-01-01
            • 1970-01-01
            • 2010-12-26
            • 1970-01-01
            相关资源
            最近更新 更多