有关Android文档的说明

时间:2013-08-08 08:29:47

标签: android android-activity android-lifecycle

  

注意:即使系统在停止时销毁您的活动,它仍会保留状态

     Bundle中的View对象(例如EditText中的文本)的

(一个blob   键值对)并在用户导航回来时恢复它们   活动的同一个实例(下一课更多讲述   使用Bundle保存其他状态数据,以防您的活动   摧毁并重新创造)。

活动的同一个实例

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

2 个答案:

答案 0 :(得分:2)

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

理论上,如果Android在停止活动时会破坏你的活动,那么它会调用onDestroy()并且GC会回收内存。实际上,Android从不会破坏个人活动以释放内存。实际上它的作用是取代整个操作系统进程。在这种情况下,onDestroy()永远不会被调用进程中的任何活动。 GC并不打算清理任何东西,因为VM(虚拟机)会立即与进程中的其他所有内容一起死亡,并且操作系统会回收进程使用的全部内存量。

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

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

一旦组件被销毁,它实际上已经死了,它正在使用的内存可以被GC回收。 Android永远不会恢复死机。

希望这能为您澄清情况。

编辑添加更多详情

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

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

注意:请记住,您要在onCreate()中保存/恢复的任何内容必须是基元(Bundleint等),或者必须实现{{1} }或boolean

The documentation of onSaveInstanceState()也包含一些有用的信息。

答案 1 :(得分:0)

存储状态,但活动被销毁以节省内存。因此,当用户在活动A中并转到活动B时,活动A将被销毁,但状态将被存储。当用户按下后退按钮时,将加载状态并恢复所有内容。

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