注意:即使系统在停止时销毁您的活动,它仍会保留状态
Bundle中的View对象(例如EditText中的文本)的(一个blob 键值对)并在用户导航回来时恢复它们 活动的同一个实例(下一课更多讲述 使用Bundle保存其他状态数据,以防您的活动 摧毁并重新创造)。
活动的同一个实例
它是如何被破坏和重新创建的确切实例,它不是一个新的内存块(另一个实例),任何人都可以帮助我清除这一点吗?
答案 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()
中保存/恢复的任何内容必须是基元(Bundle
,int
等),或者必须实现{{1} }或boolean
。
The documentation of onSaveInstanceState()
也包含一些有用的信息。
答案 1 :(得分:0)
存储状态,但活动被销毁以节省内存。因此,当用户在活动A中并转到活动B时,活动A将被销毁,但状态将被存储。当用户按下后退按钮时,将加载状态并恢复所有内容。
当活动调用onStop和onStart时,系统会执行此操作。我没有做任何测试,我只是在说我的理解。