6

注意:即使系统在停止时破坏了您的活动,它仍然保留状态

Bundle(键值对的 blob)中的 View 对象(例如 EditText 中的文本),并在用户导航回 活动的同一实例时恢复它们(下一课将更多地讨论使用 Bundle保存其他状态数据以防您的活动被破坏并重新创建)。

活动的同一实例

当它被销毁和重新创建时,它怎么可能是精确的实例,它不会成为一个新的内存块(另一个实例),有人可以帮我清除这一点吗?

4

2 回答 2

2

不幸的是,文档在很多方面都不是很清楚。这是其中之一。

理论上,如果 Android 在停止时销毁您的活动,那么它会调用onDestroy()并且 GC 会回收内存。实际上,Android 从不破坏单个活动来释放内存。它实际上所做的是它杀死了整个操作系统进程。在这种情况下,onDestroy()永远不会调用流程中的任何活动。GC 不会费心清理任何东西,因为 VM(虚拟机)会立即与进程中的其他所有内容一起死亡,并且进程使用的全部内存量都由操作系统回收。

当您的用户导航回您的应用程序时,Android 会为您的应用程序创建一个全新的进程,然后它将为您的活动创建一个新实例。在这种情况下,它当然会为实例获得一个全新的内存块。您还将看到构造函数被调用并且onCreate()也将被调用。但是,由于 Android 会保存 Activity 视图的状态,因此该状态将由 Activity 通过调用来恢复super.onCreate()

在某些情况下,Android 会销毁一个 Activity 实例并自动创建一个新实例。例如,这是在配置(即:方向)更改期间完成的。在这种情况下,Android 会调用onDestroy()旧实例并创建 Activity 的新实例。新实例获取旧实例的保存状态,因此可以恢复视图的状态。在这种情况下,由于正在创建一个新实例,因此它当然会在内存中具有不同的地址。

一旦一个组件被销毁,它实际上就死了,它正在使用的内存可以被 GC 回收。Android 永远不会复活死去的实例。

希望这可以为您澄清情况。

编辑添加更多细节

Android 在自己的内部数据结构中跟踪任务和这些任务中的活动。对于每个活动,它都会保留启动该活动的副本,Intent最近Intent发送到该活动的副本,并保留Bundle包含该活动的已保存状态的副本。Android 调用onSaveInstanceState()一个 Activity 以使该 Activity 有机会保存它在 Android 决定终止该 Activity 时恢复该 Activity 所需的任何内容。的默认实现onSaveInstanceState()保存所有活动视图的状态。如果活动被 Android 杀死并重新创建(无论出于何种原因),您的实现需要保存活动需要恢复自身的任何其他内容。您的活动的私有成员变量和静态变量不会自动保存和恢复在Bundle,因此如果您需要这些才能正确地重新创建您的活动,您必须使用Bundle提供的自行保存它们onSaveInstanceState()。静态变量将在应用程序进程的整个生命周期内一直存在,但由于 Android 可以随时终止进程(以回收资源),而不会发出警告,因此您也不能依赖始终具有预期值的静态变量(在 Android 的情况下)已经杀死并重新创建了您的进程)。

如果您的 Activity(或进程)被 Android 杀死并且用户稍后导航回您的 Activity,则 Android 会使用其内部数据结构中的信息来创建该 Activity 的新实例。然后它调用onCreate()新实例,将保存的实例状态Bundle作为参数传递。然后可以使用这将活动恢复到原始实例被杀死之前的状态。Android 也会在调用onRestoreInstanceState()后调用onStart(),这样如果您不想在onCreate().

注意:请记住,您要在 a 中保存/恢复的任何内容都Bundle必须是原语(intboolean等),或者它必须实现Serializableor Parcelable

的文档也onSaveInstanceState()包含一些关于此的有用信息。

于 2013-08-08T09:09:42.100 回答
0

存储状态,但销毁活动以节省内存。所以,当用户在一个 Activity A 中去 Activity B 时,Activity A 被销毁了,但是状态被存储了。当用户按下后退按钮时,状态将被加载,一切都将被恢复。

当活动调用 onStop 和 onStart 时,系统会执行此操作。我没有做任何测试,我只是说我理解的。

于 2013-08-08T08:39:23.927 回答