【问题标题】:Android: Clearing only second activity in the stack (or clearing specific activity)Android:仅清除堆栈中的第二个活动(或清除特定活动)
【发布时间】:2016-01-20 18:38:46
【问题描述】:

在我的应用中有三个活动。

A可以打开B

B可以打开C,或者返回A,或者返回C(如果从C打开)

C可以打开B,或者返回A

我已经使用各种RESULT_CODEs 和onActivityResults 实现了这一点。但是,长时间使用该应用后,堆栈变得太大了!

我需要从堆栈中清除活动。查看我的应用程序的结构,最好的清除方法围绕着清除堆栈上的 第二个 活动(假设 A 始终是堆栈上的第一个/底部活动)。为了便于理解,我画了一张速写:

一旦将B 添加到ABC 上,之前的B(堆栈中的第二个活动)就会被删除。将C 添加到ACB 后,将删除先前的C(堆栈中的第二个活动)。

我可以想到两种方法来做我描述的事情:

  1. 清除堆栈中的第二个活动

  2. 删除堆栈中与我正在创建的活动相同的所有活动(C 创建B,因此需要清除另一个B

但是,我还没有找到在代码中实现这一点的方法。我曾尝试使用Intent.FLAG_ACTIVITY_CLEAR_TOP,但这会清除堆栈中除A 之外的所有内容,然后在顶部添加新活动。

所以我的问题是:我怎样才能实现方法 1 或方法 2?(不管是哪一个)

这是我清除堆栈中所有但 A 的示例:

Intent newActivity = new Intent(this, B.class);
newActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivityForResult(newActivity, MY_REQUEST_CODE);

我也愿意接受其他方法。也许以某种方式使用FLAG_ACTIVITY_NO_HISTORY

【问题讨论】:

  • 不确定您的活动在做什么,但这听起来像是片段的完美用例。在此处查看我的答案stackoverflow.com/questions/34667170/…,以获取重用堆栈中现有片段并限制回栈深度的示例。

标签: java android


【解决方案1】:

因此,您似乎希望保留 B 活动和 C 活动的一个实例。这可以通过在 Manifest.xml 中添加 XML 属性来完成

<activity android:name="B" android:launchMode="singleTask" </activity>

"singleTask" - 系统在新任务的根目录创建活动并将意图路由到它。但是,如果活动的实例已经存在,系统会通过调用其 onNewIntent() 方法将意图路由到现有实例,而不是创建一个新实例。 Refer to here for more information.

【讨论】:

  • 一开始这似乎很完美,但我注意到在将该属性添加到清单后,在返回A 活动时,onActivityResult 不会被调用
【解决方案2】:

我遇到了同样的问题,要杀死一些特定的活动..我的解决方案是实现用于管理活动的 StackActivityManager:

  1. 每个活动都保存在静态列表中,其中包含我的应用程序的所有活动
  2. 活动的保存是在母类基础活动中完成的

  3. 每个活动都有一个静态且唯一的标签,稍后用于指示哪个活动将从活动堆栈中删除

  4. 启动模式为singleTask,避免activity栈中出现重复activity。

【讨论】:

    【解决方案3】:

    尝试做的方法:

    Intent intent = new Intent(Activity1.this, Activity2.class);
    startActivity(intent);
    
    //The finish(); method, destroy the current activity. 
    finish();
    

    调用下一个活动后,当前活动销毁。 我希望它有效。 :)

    【讨论】:

    • 如果活动开始另一个版本的自己(如B 开始另一个B),这将非常有用。不幸的是,在我的情况下,B 总是以 C 开头,然后需要清除之前的 C,而不是 B
    【解决方案4】:

    删除这一行

    newActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    

    尝试添加您的代码-

    Intent newActivity = new Intent(this, B.class);
    newActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    newActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivityForResult(newActivity, MY_REQUEST_CODE);
    

    【讨论】:

      【解决方案5】:

      注意:Cory Charlton 在他关于Fragments 的评论中所写的内容可能是任何有类似问题的人的最佳解决方案。我建议尝试该路线而不是我自己的解决方案。我采用自己的解决方案的唯一原因是因为我需要一个快速的解决方案,并且没有时间在截止日期前学习如何实施Fragments。

      我最终通过让A 活动始终启动C 活动而不是B 活动来解决问题。 B 活动不再创建 C 活动,而是完成以返回到 C

      这样堆栈永远不会超过 3。

      为了提供一些代码,我必须在完成 B 活动之前添加它,因为它现在不再传递对象,而是返回它:

      setResult(RESULT_OK, getIntent().putExtra(KEY_MY_OBJECT, myObject));
      

      【讨论】:

        猜你喜欢
        • 2011-10-27
        • 1970-01-01
        • 2012-09-19
        • 2011-09-19
        • 1970-01-01
        • 2012-04-20
        • 1970-01-01
        • 1970-01-01
        • 2018-12-01
        相关资源
        最近更新 更多