以下是该方案:
A
中,我有“发布到Twitter”选项,该选项调用执行帖子的活动B
并通过执行A
返回Activity#finish()
,流程为{ {1}} A->B->A
活动会在浏览器中调用Twitter移动OAuth页面。然后浏览器将用户重定向回B
。但是当B
完成后我调用B
我将返回到预期的浏览器登录页面,因为堆栈现在是Activity#finish()
。如何退步3步而不只是退步?它甚至可能吗?我不想重新打电话给A->B->browser->B
,因为至少我会失去一个列表位置
答案 0 :(得分:2)
您可以使用FLAG_ACTIVITY_CLEAR_TOP和FLAG_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结合使用:如果用于启动任务的根活动,它将把该任务的任何当前运行的实例带到前台,然后将其清除到其根状态。这在从通知管理器启动活动时尤其有用。 有关任务的详细信息,请参阅任务和后台堆栈。