10

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

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

这发生在 JB 和 ICS 上,我没有在旧版本上测试过。我做错了什么还是我误解了文档中的某些内容?

4

2 回答 2

18

如果你在前台杀死你的应用程序,这与 Android 杀死你的应用程序不同(只有当你的应用程序在后台时才会这样做)。如果您杀死然后重新启动应用程序,就像从头开始重新启动它一样。这里没有“恢复”。如果您添加日志记录,onCreate()您应该会看到在您杀死并重新启动您的应用程序后,Bundle传递给onCreate()的值为空。

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

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

这是一个用于讨论目的的具体示例。首先没有开发人员选项“不保留活动”:

  • ActivityA是根活动
  • 我们开始ActivityA
  • ActivityA.onCreate()叫做
  • ActivityA现在开始ActivityB
  • ActivityB.onCreate()被调用(活动堆栈现在包含ActivityA-> ActivityB
  • ActivityB以一个额外的“foo”ActivityA开头FLAG_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以一个额外的“foo”ActivityA开头FLAG_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().

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

于 2013-02-13T12:38:49.427 回答
3

不确定您是否找到了解决方案,但是覆盖目标活动的 onNewIntent(Intent theNewIntent) 方法并调用 setIntent(theNewIntent) 为我解决了这个问题。

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    /*
     * This overrides the original intent.
     */      
    setIntent(intent);
}
于 2013-08-19T06:09:19.337 回答