Android:仅清除堆栈中的第二个活动(或清除特定活动)

时间:2016-01-19 18:30:11

标签: java android

在我的应用程序中有三项活动。

A可以打开B

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

C可以打开B,或返回A

我已使用各种RESULT_CODEonActivityResult来实现此功能。但是,长时间使用应用程序后堆栈会变得太大!

我需要清除堆栈中的活动。查看我的应用程序结构,最好的清除方法围绕清除堆栈上的第二个活动(假设A始终是堆栈上的第一个/底部活动)。我做了一个快速的绘画,使其更容易理解:

enter image description here

B添加到ABC后,将删除之前的B(堆栈中的第二个活动)。将C添加到ACB后,将删除之前的C(堆栈中的第二个活动)。

我可以想到两种方法可以实现我所描述的:

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

  2. 删除堆栈中与我正在创建的活动相同的任何活动(C创建B,因此其他B需要是清零)

  3. 但是,我还没有找到在代码中实现此功能的方法。我尝试过使用Intent.FLAG_ACTIVITY_CLEAR_TOP,但在{@ 1}}之外清除堆栈中的所有内容,然后在顶部添加新活动。

    所以我的问题:如何实施方法1或方法2?(无论哪一个)

    以下是我清除堆栈中所有内容但A

    的示例
    A

    我也对替代方法持开放态度。也许以某种方式使用Intent newActivity = new Intent(this, B.class); newActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivityForResult(newActivity, MY_REQUEST_CODE);

5 个答案:

答案 0 :(得分:2)

所以看起来你想要保留B活动和C活动的一个实例。这可以通过在Manifest.xml中添加XML属性来完成

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

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

尝试做方法:

Intent intent = new Intent(Activity1.this, Activity2.class);
startActivity(intent);

//The finish(); method, destroy the current activity. 
finish();

在调用下一个活动后,当前的活动会破坏。 我希望它有效。 :)

答案 3 :(得分:0)

删除此行

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

答案 4 :(得分:0)

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

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

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

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

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