场景如下:
- 在活动
A
中,我有"发布到Twitter"选项,该选项调用执行帖子并通过执行Activity#finish()
返回A
的活动B
,流量为A->B->A
- 然而,如果我没有登录到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结合使用,效果很好:如果用于启动任务的根活动,它将把该任务的任何当前运行的实例带到前台,然后将其清除到根状态。例如,当从通知管理器启动活动时,这尤其有用。有关任务的更多信息,请参见任务和后台堆栈。