在启动另一个活动之前清除活动堆栈

时间:2011-10-17 16:01:56

标签: android activity-stack

你好(我的第一个问题; - )

可能存在类似的问题,但似乎没有一个问题可以回答我的问题或给我一个真正的解决方案......


问题
A(root)启动BB可以开始其他活动。 A决定解除堆栈(网络连接丢失)并启动C。这似乎是一个激烈的决定,但用户会期望这种情况在这种情况下真的有意义......

问题
怎么做?我希望使用某个标志或只是调用dismissStack之类的东西。但是我找不到正确的解决方案(参见下面的研究)。

研究
我阅读了很多文档但是可用的标志与我的需求不符(或者我没理解它)。其他答案告诉我要记住已启动的活动(例如在数组中)并在需要时完成它们。但这对我来说似乎很脏,不知怎的,我不能接受这是正确的解决方案。我希望有一些更清洁的东西吗?!
(存储堆栈似乎对我来说甚至是错误的。您的应用程序可能被系统杀死,因此您的静态数据,但您的历史记录将在启动时再次加载。因此您必须保留已保存的堆栈。这甚至更脏...... 。)

更新
我的代码和我尝试过的(抽象的):

// in A
startActivityForResult(new Intent(this, B.class), REQUEST_B);

// network fail in A
// setting any flags on C has no influence
startActivityForResult(new Intent(this, C.class), REQUEST_C);

FLAG_ACTIVITY_CLEAR_TOP无解,请阅读文档......)

我在C上按返回B仍然会弹出,并且仍然存在......

我可以通过调用finishActivity(REQUEST_B)删除活动。但是当B启动另一个活动D时,如果我稍后点击C上的返回,它仍会弹出。 B已消失,但D仍在那里......


我确信有些东西我还没有理解或者只是错过了。有人可以给我一个暗示或批准我的研究,如果它必须真的那样......

3 个答案:

答案 0 :(得分:1)

我认为您正在寻找与您的意图一起使用的FLAG_ACTIVITY_CLEAR_TOP标志。

从上面链接的文档中,提供了一个示例:

  

例如,考虑一个由活动组成的任务:A,B,C,D。如果D调用带有解析为活动B组件的Intent的startActivity(),那么C和D将完成并且B接收给定的Intent,导致堆栈现在为:A,B。

您可以在Android Dev Docs中的this link详细了解Android中的任务和Backstack

答案 1 :(得分:0)

这就是我到目前为止所做的,它的效果非常好:

使用startActivityForResult。如果您实际上不需要等待结果,请创建虚拟请求代码。然后在每个活动的onDestroy中执行此操作。

if (isFinishing()) {
    finishActivity(REQUEST_CODE);
}

例如:您在堆栈中有A, B, C, D,从finishActivity(REQUEST_B)拨打A,这会链接onDestroy来电,以便B杀死C }}和C杀死了D


这是我能想到的最好的解决方案。其他解决方案正在搞乱活动生命周期和/或容易出错。

我仍然希望有一种更清洁的方式......

答案 2 :(得分:0)

您可以同时使用新任务的标志和清除任务来清除堆栈中的所有先前活动

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);