有关Android文档的说明

nis*_*013 6 android android-lifecycle android-activity

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

Bundle中的View对象(例如EditText中的文本)(一对键值对),如果用户导航回活动的同一个实例,则恢复它们 (下一课讲述有关使用Bundle的更多信息)保存其他状态数据,以防您的活动被销毁和重新创建).

同一个活动的实例

它是如何被破坏和重新创建的确切实例,它不是一个新的内存块(另一个实例),任何人都可以帮我清除这一点吗?

Dav*_*ser 2

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

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

当您的用户导航回您的应用程序时,Android 会为您的应用程序创建一个全新的进程,然后它将创建您的 Activity 的新实例。在这种情况下,它当然会为实例获得一个全新的内存块。您还将看到构造函数被调用并且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等),或者必须实现SerializableParcelable

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