Android静态对象生命周期
我正在创build事件search应用程序,我们从一个屏幕中设置search条件在另一个屏幕上填充,然后用户可以从第三屏幕编辑search条件,并进入第四屏幕。
为了实现上述任务,我使用了静态对象,它记住了应用程序的值,我不需要做任何额外的事情。
但是,如果关于Android的静态对象生命周期,如果低内存findandroid删除静态对象,恐怕我?
由于Android支持多任务处理,如果用户切换到另一个应用程序,并且当用户回来应用程序开始行事疯狂,多任务时,静态对象被删除? 任何想法 ?? 也build议通过单例方法保持静态对象是更好的方法?
让我们从一些背景开始:当你启动一个应用程序时会发生什么?
OS启动一个进程并为其分配一个唯一的进程ID并分配一个进程表。一个进程启动一个DVM(Dalvik VM)的实例; 每个应用程序在DVM中运行。
一个DVMpipe理类加载卸载,实例生命周期,GC等
静态variables的生命周期:一个静态variables在JVM加载一个类时出现,当这个类被卸载时死掉。
因此,如果您创build一个android应用程序并初始化一个静态variables,它将保留在JVM中,直到发生以下情况之一:
1.class级卸载
2. JVMclosures
3.过程死亡
请注意,当您切换到另一个应用程序的另一个活动时,静态variables的值将保持不变,并且上述三个都不会发生。 如果上述三者中任何一个发生,静态将失去其价值。
你可以用几行代码来testing它:
- 在你的活动的onCreate中打印未初始化的静态 – >应该打印null
- 初始化静态。 打印它 – >值将是非空
- 点击后退button,进入主屏幕。 注意:主屏幕是另一个活动。
- 再次启动你的活动 – >静态variables将是非空的
- 从DDMS中停止你的应用程序进程(在设备窗口停止button)。
- 重新启动你的活动 – >静态将有空值。
希望有所帮助。
那么,Singleton模式也是基于使用静态variables,所以实际上你将处于相同的位置。 虽然静态方法可能在大多数情况下都是有效的,但是在某些情况下,当内存已满并且另一个活动在应用程序移动到下一个屏幕之前占用前台时,可能会导致活动的进程中断并丢失静态值。 不过,Android提供了一些在状态之间保持值或传输的选项,例如:
- 使用一个意图,您可以将您的search条件从活动传递到活动(类似于Web http请求)
- 使用应用程序首选项,您可以保存这些值并将其检索到需要它们的活动中
- 使用sqlite数据库,你可以将它们保存在一个表中,以后再检索它们
- 如果您只需要保存活动状态,以便在重新启动时,这些字段将被填充以前select的值,则可以实现onSaveInstanceState()活动方法 – 请注意,不build议在活动持久状态之间进行操作。
你可以通过在谷歌代码或其他开放源代码的Android应用程序中查看aegis-shield源代码树来获得一些代码示例,以便使用偏好,意图和sqlite数据库。
经过一番调查,事实certificate,使用应用程序来存储单身人士是不是一个伟大的想法,除非你准备重新创build它:
不要将数据存储在应用程序对象中
所以虽然接受的答案在技术上是正确的,但并不提供所有的信息。
正如上面的链接所暗示的那样,如果您确实想要坚持使用该模型,那么您需要准备好检查null并在可能的情况下重新创build数据。
@ r1k0就在这里。 将数据存储在类的静态字段中不会在应用程序进程终止并重新启动时自行保留。 当Android需要内存时,Android会经常杀死进程(正在运行的应用程序)。
根据Android文档: 活动状态和popup内存 ,
系统不会直接杀死一个活动。 相反,它会杀死活动运行的过程,不仅会摧毁活动,还会摧毁stream程中运行的所有其他活动。
您可以使用下面的方法保存和恢复基元的状态以及Serializable和Parcelable对象。 这些在正常的活动生命周期中自动调用。
protected void onSaveInstanceState(Bundle state) {} protected void onRestoreInstanceState(Bundle savedInstanceState){}
所以,如果你有一个只有静态variables的类,你可以将每个字段的状态保存在onSaveInstanceState()中,并将它们恢复到onRestoreInstanceState()中。 当Android杀死你的应用程序正在运行的过程中,variables的状态将被保存,当Android恢复你的应用程序时,这些值将被恢复到与以前相同的状态。