前言
Android 系统开发,看过 Android 一些经典的应用,代码里面 static 类型的变量并不是经常使用,但在开发中 static 确实非常好用,跨 activity 没问题,跨进程应该都可以吧。
这个 static 有什么缺点和优点,我们到底应该如何的规范使用呢?
补充下,主要想问的是:有什么理由使我们在一些情况下不推荐用static变量?比如,service和activity通信,直接用static变量传递信息,这样看似不是很规范。
非常值得一看的文章
- Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
- 详解静态变量、静态代码块、代码块、构造方法的初始化过程。
- 静态代码块:用
staitc
声明,JVM
加载类时执行,仅执行一次。 - 构造代码块:类中直接用
{}
定义,每一次创建对象时执行。 - 执行顺序优先级:静态块、
main()
、代码块、构造方法。
分析
- 在Android中不应该使用static变量,static本身依赖进程模型,而Android力图屏蔽进程的细节。毫无疑问,Application类是你需要的选择,那是堆积一些进程级别全局信息的最佳场所。
- 由于 Android 具有相应的生命周期的特征,因此 Android 程序不应该使用任何 static 变量,不应该并不是说不能,而是说使用static 变量很可能会导致bug。有多种方式可以代替static 变量,比如继承 Application 类,使用 preference ,使用 db,或者使用一个静态类来保static变量,以及保存数据到静态文件等等。
- Android 里面的常量一般来说是继承Application来定义。在使用时,使用getApplication()即可拿到需要的数据。
- 我好像使用static比较多的只有两个地方,一个是用static final定义常量,一个是单例模式时。
- static访问是无法跨进程的。Android中的Activity,Service是可以在各自进程中运行的,用static传递参数到不同进程的Activity、Service时会错。
- Android Bundle是可以跨进程传递数据的。觉得还是使用Intent传递数据为好。
- Android中一个比较好的设计是,尽量让上层不关注进程之类的东西,Activity,Service,Provider都是一个个组件。Activity和Service中使用Bundle传递机制接收参数,让其可以提供服务给手机里所有程序。
- 用static传递参数时,static定义的变量必然会设置为public或包内可访问权限。
- 关于Android 使用静态变量,我遇到过的情况是:当应用不处于与当前用户交互的情况时(例如回到HOME,跳到其他应用),离开的时间比较长时,应用的静态变量有可能被置null,,是不安全的。
- 我的意见是尽量不要使用静态变量,值类型的静态常量除外(final static)。
- 静态变量在安卓上不比其他Java环境,不管变量本身写在哪个类里,它一旦被代表组件的类初始化,比如被一个Activity初始化,它就会绑定在这个Activity类中……关键的地方来了,其他Java环境这个类一旦被加载,就可以存活到进程结束,因此给我们造成一种错觉就是,静态变量伴随整个进程……而Android的类却可能随着组件的销毁而卸载……这意味着你关闭一个Activity的时候,由这个Activity初始化的静态变量也会被置空,因此它的生命周期是不稳定的。