这是场景:


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


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

最佳答案

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

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

清除顶部会使A上方的所有活动被清除。

Single Top使意图传递给A的onNewIntent方法,而不是破坏并重新创建A。

从文档:


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

07-24 09:45
查看更多