2

您好(我在这里的第一个问题 ;-)

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


问题
A(根)开始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没有解决方案,请阅读文档...)

我按下Back并仍然弹出并且仍然存在C......B

我可以通过调用来删除活动finishActivity(REQUEST_B)。但是当B开始另一个活动时,如果我稍后再点击,D它仍然会弹出。不见了,但还在那里……BackCBD


我确定有些东西我还不明白或只是错过了。如果真的必须这样,有人可以给我一个提示或批准我的研究吗?

4

3 回答 3

1

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

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

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

您可以在 Android Dev Docs 中的此链接中查看有关 Android 中的 Tasks 和 Backstack 的更多信息

于 2011-10-17T17:17:37.067 回答
0

这就是我到目前为止所得到的,而且效果很好:

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

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

例如:你A, B, C, D在堆栈上,调用finishActivity(REQUEST_B)from A,这将链接onDestroy调用所以BkillsCCkills D


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

我仍然希望有一个更清洁的方法...

于 2011-10-18T09:57:32.190 回答
0

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

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
于 2012-11-12T11:27:26.527 回答