2

这是场景:

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

我如何退后 3 步而不是仅退一步?甚至可能吗?我不想A重新打电话,因为至少我会失去一个名单位置

4

1 回答 1

2

您可以使用FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_SINGLE_TOP执行此操作。

您需要将 A 作为新 Intent 启动,但在调用之前设置这两个标志startActivity

Clear Top 导致 A 顶部的所有活动都被清除。

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

从文档:

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

于 2011-12-13T06:18:39.010 回答