Android 慎用static静态变量

前言

Android是用Java开发,其静态变量的生命周期遵守Java的设计。
我们知道静态变量是在类被load的时候分配内存的,并且存在于方法区。
当类被卸载的时候,静态变量被销毁。
在PC机的客户端程序中,一个类被加载和卸载,可简单的等同于jvm进程的启动和结束。
那么在Android中呢?
用的Dalvik vm也是一样的。
不过Android不太突出的进程概念,所以对静态变量的生命周期就会感觉模糊,这种模糊对于值类型是无所谓的,如果是静态的对象引用,则与内存回收、内存泄漏这些问题有关,有必要加深研究和理解。

一、静态变量在类被加载的时候分配内存。

类在什么时候被加载?
当我们启动一个app的时候,系统会创建一个进程,此进程会加载一个Dalvik VM的实例,然后代码就运行在DVM之上,类的加载和卸载,垃圾回收等事情都由DVM负责。
也就是说在进程启动的时候,类被加载,静态变量被分配内存。

二、静态变量在类被卸载的时候销毁。

在Android中,静态变量在安卓上不比其他Java环境,不管变量本身写在哪个类里,它一旦被代表组件的类初始化,比如被一个Activity初始化,它就会绑定在这个Activity类中..
关键的地方来了,其他Java环境 这个类一旦被加载,就可以存活到进程结束,因此给我们造成一种错觉就是,静态变量伴随整个进程….
Android的类却可能随着组件的销毁而卸载 这意味着你关闭一个Activity的时候,由这个Activity初始化的静态变量也会被置空,因此它的生命周期是不稳定的。
也就是说,在Android中静态变量可能随时被系统置空,变为null,其它地方在使用的时候就会产生空指针现象。

三、Android中的进程什么时候结束

这个是Android对进程和内存管理不同于PC的核心——如果资源足够,Android不会杀掉任何进程,另一个意思就是进程随时可能会被杀掉。
而Android会在资源够的时候,重启被杀掉的进程。
也就是说静态变量的值,如果不做处理,是不可靠的,可以说内存中的一切都不可靠。
如果要可靠,还是得保存到文件中去,在重启的时候恢复回来。
另一种情况就是不能把退出所有Activity等同于进程的退出,所以在用户点击图标启动应用的时候,以前存放于静态变量中的值,有可能还存在,因此要视具体情况给予清空操作。

四、Application也是一样不可靠

Application其实是一个单例对象,也是放在内存中的,当进程被杀掉,就全清空了,只不过Android系统会帮重建Application,而我们存放在Application的数据自然就没有了,还是得自己处理。

不过我们可以在Application被销毁时直接退出程序
其实 Application都被销毁了 程序就应该退出的

文章转载自http://blog.csdn.net/ctcwri/article/details/8858414