Android中使用static变量

标签: Android静态变量 static变量生命周期
7人阅读 评论(0) 收藏 举报
分类:

引入:

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

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

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

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

类在什么时候被卸载?在进程结束的时候。

说明:一般情况下,所有的类都是默认的ClassLoader加载的,只要ClassLoader存在,类就不会被卸载,而默认的ClassLoader生命周期是与进程一致的,这里讨论一般情况。

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

这个是Android对进程和内存管理不同于PC的核心。如果资源足够,Android不会杀掉任何进程,另一个意思是进程随时可能会被杀掉。而Android会在资源足够的时候,重启被杀掉的进程。也就是说静态变量的值,如果不做处理,是不可靠的,可以说内存中的一切都不可靠,如果要可靠,还是保存到SharedPreferences或者SD卡中去,在重启的时候恢复回来。

另一个种情况就是不能把退出所有Activity等同于进程的退出,所以在用户点击图标启动应用的时候,以前存放于静态变量中的值,有可能还存在,因此要视具体情况给予清空操作。

四、Application也是一样不可靠

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

五、静态引用的对象会不会被回收?

在除了Android之外的Java运行环境中,你只要关心进程生命周期,在进程生命周期内你可以放心地使用静态变量来保持数据。只要静态变量没有被销毁也没有置null,其对象一直被保持引用,因此不会被垃圾回收。因此单例对象在运行时不会被回收。但是Android里它随时会被系统置NULL。

六、总结:

Android中,我们不知道何时进程会被kill,所以:

  • 不能保证静态变量会一直存在。(进程可能被Kill掉)
  • 每次打开app时静态变量的值都是初始值(进程没有被kill掉所有静态变量保存的还是上次的值)。
  • 而静态变量是不会被垃圾回收的,其对象一直保持引用
查看评论

c++ static 变量的使用和用途

在C语言中,关键字static的意思是静态,它有3个明显的作用: 1)在函数体内,静态变量具有记忆功能,即一个被声明为静态的变量在这一函数被调用的过程中其值维持不变。 2)在模块内,它的作用是限制...
  • qq_22171961
  • qq_22171961
  • 2016-07-13 22:57:24
  • 143

c++类中static 类型变量使用

在C++语音中类的静态数据成员在初始化时比较特殊,以为它并不是在类的定义中初始化,而是在类的定义外被初始化。如下示例:#include"iostream" #include"string.h" cl...
  • u012248972
  • u012248972
  • 2016-06-11 20:09:40
  • 2371

使用@Value 注解获取配置文件中的值如何赋值给static变量

        现在很多项目中很多的校验规则,类型,等很多数据都不会在项目中写死,而是做成可配置的,这样当新加了校验规则或者是类型等数据的时候就不用去修改代码,而是在配置文件中去加或者修改配置文件,修...
  • ghbxj1989
  • ghbxj1989
  • 2018-03-07 18:15:47
  • 52

android jni使用static变量

  • 2011年12月22日 13:20
  • 76KB
  • 下载

Kotlin中的static

Kotlin中的static
  • xufazhong
  • xufazhong
  • 2017-06-09 10:45:57
  • 1886

Android中static有关的内存泄漏

一、Handler,Message,Runnable   考虑下面的代码:  public class SampleActivity extends Activity { p...
  • probuing
  • probuing
  • 2015-12-05 00:12:38
  • 1866

关于Android中静态变量static被回收问题

最近接手一个项目,是别人开发差不多的负责维护。发现一个bug,就是长时间挂后台待机再次进去会”白屏“。或者在低端机开大量程序后也会出现。只能退出程序重新登录。 后来经过排查,发现正是保存登录信息的静态...
  • big_man
  • big_man
  • 2014-12-17 17:22:37
  • 3041

static方法只能调用static方法或者变量

public class testa { String name; static int  missileNum;     static void fire(){ if(missileNum>...
  • yidada66
  • yidada66
  • 2015-11-09 19:02:07
  • 199

android static变量退出后没有清除

前几天遇到一个很奇怪的bug,有一个静态变量一直会递增,具体
  • jeden
  • jeden
  • 2014-08-21 17:39:25
  • 726

static变量放在头文件的后果

问题:想用 static TList* g_xxx =NULL; 当全局变量存链表头,但是可能在多处使用该全局变量,listGetHead()之类的参数用,所以就打算把static变量暴露出去,放在头...
  • huqinweI987
  • huqinweI987
  • 2015-10-30 16:05:57
  • 1513
    个人资料
    等级:
    访问量: 2587
    积分: 155
    排名: 110万+
    文章分类
    文章存档
    最新评论