2016-01-19 106 views
1

在我的应用程序中有三个活动。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需要清除)

但是,我还没有找到一种方法来在代码中实现这一点。我尝试过使用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

+2

不知道你的活动在做什么,但这听起来像是一个完美的碎片用例。查看我的答案在这里,https://stackoverflow.com/questions/34667170/manage-the-backstack-in-android/34667350#34667350,重新使用堆栈中的现有片段和限制后台堆栈深度的示例。 –

回答

0

注意:什么科里查尔顿在他的评论关于Fragment s写道可能是任何人有类似问题的最佳解决方案。我建议尝试这条路线,而不是我自己的解决方案。我使用自己的解决方案的唯一原因是因为我需要一个快速解决方案,并没有时间学习如何在截止日期前实施Fragment

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

这样堆栈永远不会大于3

并提供一些代码,我曾在B活动结束前补充这一点,因为它现在不再是传递一个对象,但返回它:

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

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

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

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

+0

起初看起来很完美,但我注意到在向清单中添加该属性之后,在返回到“A”活动时,onActivityResult不称为 – Chronicle

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

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

  1. 每个活动都保存在静态列表中,其中包含我的应用程序的所有活动lication
  2. 活动的储蓄做母亲阶级基础活动

  3. 每个活动都以后使用静态和独特的标记,表示该活动将从活动

  4. 起跑模式的堆栈被删除是singleTask以避免活动堆栈中的重复活动。
1

尝试做方法:

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

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

呼叫下一个活动之后,那么当前活动破坏。 我希望它有效。 :)

+0

如果活动开始另一个版本的(像'B'开始另一个'B')。不幸的是,在我的例子中'B'总是启动一个'C',它是之前需要清除的'C',而不是'B'。 – Chronicle