如果你在前台杀死你的应用程序,这与 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()
它时,它实际上并没有改变Intent
Android 保存和恢复的内容。这只会更改Intent
将从调用返回的内存中的getIntent()
.
我希望这现在更清楚了。如果没有,请告诉我。