Android历史堆栈-回溯到不止一步



场景如下:

  1. 在活动A中,我有"发布到Twitter"选项,该选项调用执行帖子并通过执行Activity#finish()返回A的活动B,流量为A->B->A
  2. 然而,如果我没有登录到Twitter,那么B活动在浏览器中调用Twitter移动OAuth页面。然后浏览器将用户重定向回B。然而,当B完成并调用Activity#finish()时,我将返回浏览器登录页面,这是预期的,因为堆栈现在是A->B->browser->B

我如何后退三步而不是一步?这可能吗?我不想重新调用A,因为至少我将失去一个列表位置

您可以使用FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP来完成此操作。

你需要启动A作为一个新的意图,但在调用startActivity之前设置这两个标志

Clear Top导致A上面的所有活动被清除。

Single Top导致意图被传递给A的onNewIntent方法,而不是销毁和重新创建A。

From the docs:

如果设置,并且正在启动的activity已经在当前任务中运行,那么不是启动该activity的新实例,它上面的所有其他activity将被关闭,并且这个Intent将作为一个新Intent传递给(现在在顶部的)旧activity。例如,考虑一个由活动组成的任务:a, B, C, D。如果D调用startActivity(),并使用一个解析为活动B的组件的Intent,那么C和D将完成,B接收给定的Intent,导致堆栈现在是:a, B。在上面的例子中,当前运行的activity B的实例要么在它的onNewIntent()方法中接收你在这里开始的新意图,要么自己完成并重新启动新意图。如果它已经声明了它的启动模式为"multiple"(默认),并且你没有在相同的意图中设置FLAG_ACTIVITY_SINGLE_TOP,那么它将被完成并重新创建;对于所有其他启动模式,或者如果设置了FLAG_ACTIVITY_SINGLE_TOP,则该Intent将被传递给当前实例的onNewIntent()。这种启动模式还可以与FLAG_ACTIVITY_NEW_TASK结合使用,效果很好:如果用于启动任务的根活动,它将把该任务的任何当前运行的实例带到前台,然后将其清除到根状态。例如,当从通知管理器启动活动时,这尤其有用。有关任务的更多信息,请参见任务和后台堆栈。

最新更新