如果提供了清除顶部和单个顶部标志,则在活动被杀死后意图未正确恢复

fut*_*sta 9 android android-intent

在我的应用程序中,有一个使用FLAG_ACTIVITY_SINGLE_TOPFLAG_ACTIVITY_CLEAR_TOP标志启动的活动,因为我想确保该活动的只有一个实例位于堆栈的顶部,并且旧实例顶部的所有活动都将关闭.到现在为止还挺好.

接下来,我想测试活动在多次创建并连续销毁后是否正确恢复.我注意Activity.setIntent()Activity.onNewIntent()调用时手动设置intent ,以便返回最近的intent Activity.getIntent().为了测试我在开发人员选项中激活了"不要保持活动"选项,但Activity.getIntent()重新创建活动时返回的意图是创建它而不是最新创建它的第一个意图.

这发生在JB和ICS上,我还没有在旧版本上测试它.我做错了什么或者是否误解了文档中的内容?

Dav*_*ser 17

如果您在应用程序处于前台时终止该应用程序,则这与Android杀死您的应用程序时不同(仅当您的应用程序在后台时才会执行).如果您杀了然后重新启动应用程序,就像从头开始重新启动它.这里没有"恢复".如果您添加日志记录,onCreate()您应该看到在您终止并重新启动应用程序后,Bundle传递给它的onCreate()是null.

不幸的是,很难模拟Android杀死你的应用时会发生什么.

编辑:OP评论后添加更多内容

这是用于讨论目的的具体示例.首先没有开发者选项"不要保持活动":

  • ActivityA 是根活动
  • 我们开始 ActivityA
  • ActivityA.onCreate() 叫做
  • ActivityA 现在开始了 ActivityB
  • ActivityB.onCreate()被调用(活动堆栈现在包含ActivityA- > ActivityB)
  • ActivityB开始ActivityAFLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP和一个额外的"富"
  • ActivityA.onNewIntent()Intent包含FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP和额外的"foo" 调用
  • ActivityB.onDestroy() 因为活动堆栈被清除回来而被调用 ActivityA

现在,让我们做同样的事情,但启用开发人员选项"不要保持活动"(我用粗体突出显示与前一个场景不同的东西):

  • ActivityA 是根活动
  • 我们开始 ActivityA
  • ActivityA.onCreate() 叫做
  • ActivityA 现在开始了 ActivityB
  • ActivityB.onCreate()被调用(活动堆栈现在包含ActivityA- > ActivityB)
  • 因为ActivityA已经停止,Android会销毁它并调用它ActivityA.onDestroy()
  • 注意:活动堆栈仍包含ActivityA- > ActivityB,即使此时没有实例ActivityA.Android会记住所有州
  • ActivityB开始ActivityAFLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP和一个额外的"富"
  • 由于Android没有ActivityA重新激活的实例,它需要创建一个,所以它确实然后......
  • ActivityA.onCreate()调用与创建Intent原始实例时调用的相同ActivityA(即:LAUNCH意图没有标志,没有额外的)
  • ActivityA.onNewIntent()Intent包含FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP和额外的"foo" 调用
  • ActivityB.onDestroy() 因为活动堆栈被清除回来而被调用 ActivityA

这里需要注意的重要一点是Android总是onCreate()在创建活动实例时调用.把它想象成一个构造函数Activity.如果Android必须重新创建一个实例,Activity因为该进程被终止或活动被销毁,那么它将实例化一个新对象,然后调用onCreate()然后(如果需要)它将调用onNewIntent().

当你打电话时,setIntent()这实际上并没有改变IntentAndroid保存和恢复.这只会改变Intent从调用返回的内存getIntent().

我希望现在更清楚了.如果没有,请告诉我.