Android历史堆栈 - 不止一步

时间:2011-12-11 01:39:11

标签: android back-stack android-navigation

以下是该方案:

  1. 在活动A中,我有“发布到Twitter”选项,该选项调用执行帖子的活动B并通过执行A返回Activity#finish(),流程为{ {1}}
  2. 但是,如果我没有登录Twitter,那么A->B->A活动会在浏览器中调用Twitter移动OAuth页面。然后浏览器将用户重定向回B。但是当B完成后我调用B我将返回到预期的浏览器登录页面,因为堆栈现在是Activity#finish()
  3. 如何退步3步而不只是退步?它甚至可能吗?我不想重新打电话给A->B->browser->B,因为至少我会失去一个列表位置

1 个答案:

答案 0 :(得分:2)

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

您需要启动A作为新的Intent,但在调用startActivity

之前设置这两个标志

清除顶部会导致A之上的所有活动被清除。

Single Top会将意图传递给A的onNewIntent方法,而不是销毁和重新创建A.

来自文档:

  

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