【问题标题】:How to close all activities in a task without clearing the entire backstack?如何在不清除整个后台堆栈的情况下关闭任务中的所有活动?
【发布时间】:2017-08-30 19:27:46
【问题描述】:

假设我有活动:

首先-----------------打开

A -> B -> C -> D -> E -> F

我想在打开 F 时调用活动 C、D、E 的完成,将 A、B 留在后面的堆栈中,这样当用户从 F 回击时,它们会到达 B,依此类推。

我见过大量清除后台堆栈或从后台堆栈中拉出一个活动并清除其余活动的示例,但是每次我尝试关闭一个任务时,我都会得到一个空后台堆栈并且后退按钮会掉下来退出应用程序。我希望有关于这个特定案例的更多信息,以及最佳实践是什么(C、D、E、F 是一个具有 API 副作用的工作流程,一旦离开不应重新输入,而是退出应用程序后按也不是我想要的。)

【问题讨论】:

    标签: android android-activity task


    【解决方案1】:

    一个选项是使用 B 中的startActivityForResult(),因此将打开 C。然后使用FLAG_ACTIVITY_FORWARD_RESULT 打开下一个活动,直到到达 F。

    覆盖 F 中的 onBackPressed() 以调用 setResult(),因此用户将返回 B。如果您不再次调用 startActivityForResult(),用户将永远无法再次访问 Activitys C 到 F .

    您可以在我的 answer to another SO post

    【讨论】:

      【解决方案2】:
      1. 假设您有以下 A->B->C->D->E 活动,并且当您从活动 E 中回退时,您不想看到活动 C 和 D。李>
      2. 那么你必须使用这个将意图 A 传递给 B

      Intent i=new Intent(A.this,B.class);
      startActivity(i);
      

      1. 那么你必须使用这个将意图B传递给C

      Intent i=new Intent(B.this,C.class);
      startActivity(i);
      

      1. 然后你必须使用这个将意图 C 传递给 D

      Intent i=new Intent(C.this,D.class);
      startActivity(i);
      finish();
      

      1. 然后你必须使用这个将意图 D 传递给 E

      Intent i=new Intent(D.this,E.class);
      startActivity(i);
      finish();
      

      1. 最后你得到Activity E,然后当你从Ebackpressed时,你可以进入Activity B,然后A。 谢谢你快乐编码

      【讨论】:

      • 我认为我在最初的问题中没有明确说明这一要求;您应该能够在 D、C、B 中向后移动,直到调用完成。
      • 你必须完成那些你以后不想看到的活动
      • 我在问,有没有办法在工作流完成后完成任务,同时让用户在该工作流中向后移动直到完成?
      • 是的!使用finishAffinity
      • 这会在任务管理器中创建多个应用程序实例;有没有办法抑制这种行为并将所有任务/关联性保持在从任务管理器查看的同一个“应用程序”中?
      【解决方案3】:

      我能找到的最好的解决方法是用 FLAG_ACTIVITY_TASK_ON_HOME 标记最终任务,就我而言,这恰好是出发点在后台堆栈中的任务。这并不完全是问题的答案,但如果您试图从后台清除不稳定的工作流程,并且您不希望用户随后在后台“退出”您的应用程序,这是一个可行的选择。在此处查看有关该主题的主题:Android - Clearing Navigation Backstack

      编辑:下面的代码创建了我刚刚注意到的单独的应用程序实例;不知道有没有办法防止这种情况发生。

      我想出的解决方案是使用你在清单 xml 中设置的 taskAffinity:

      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="co.example.app">
        <activity
        android:name=".activities.SplashActivity"
        android:launchMode="singleTop"
        android:taskAffinity="@string/affinity_main">
        </activity>
        <activity
        android:name=".activities.MainActivity"
        android:launchMode="singleTop"
        android:taskAffinity="@string/affinity_main">
        </activity>
        <activity
        android:name=".activities.WorkflowStepOneActivity"
        android:launchMode="singleTop"
        android:taskAffinity="@string/affinity_main">
        </activity>
        <activity
        android:name=".activities.WorkflowStepTwoActivity"
        android:launchMode="singleTop"
        android:taskAffinity="@string/affinity_workflow">
        </activity>
        <activity
        android:name=".activities.WorkflowStepThreeActivity"
        android:launchMode="singleTop"
        android:taskAffinity="@string/affinity_workflow">
        </activity>
        <activity
        android:name=".activities.LeaveWorkflowActivity"
        android:launchMode="singleTop"
        android:taskAffinity="@string/affinity_main">
        </activity>
      </manifest>
      

      启动应用程序的主要关联性可能会收集在没有声明关联性的任务中启动的任何活动,但是当我想为我的工作流启动一个新的关联性时,我会在意图中添加新任务: 在 MainActivity 或我调用工作流的任何地方:

      public void startWorkflow() {
        Intent intent = new Intent(MainActivity.this, 
        WorkflowStepOneActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
      }
      

      在中间工作流程步骤中,我们没有做任何特别的事情:

      public void startWorkflowTwo() {
        Intent intent = new Intent(MainActivity.this, 
        LeaveWorkflowActivity.class);
        startActivity(intent);
      }
      

      最后,在为 post-workflow 活动触发 Intent 之后,我们在 LAST 工作流活动中调用 Affinity 上的完成:

      public void startWorkflowCompleted() {
        Intent intent = new Intent(MainActivity.this, 
        WorkflowCompletedActivity.class);
        startActivity(intent);
        finishAffinity();
      }
      

      这意味着我们的堆栈将如下所示:

      SplashActivity -> MainActivity -> LeaveWorkflowActivity
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多