现在的位置: 首页 > 综合 > 正文

Android中静态变量(static)的使用

2016年12月10日 ⁄ 综合 ⁄ 共 1086字 ⁄ 字号 评论关闭

在Android 开发过程中想必有很多人喜欢使用 static 静态变量,当然我也喜欢。但是往往会出现一些意想不到的Bug。

最近公司的一个项目由我和另一个同事共同负责,我这边负责一个Service,操作在一个Service中完成,开发结束本人测试也正常,但是整合到同事项目中却出现了静态变量获取不到值,一开始是怀疑同事那边静态变量赋值出现问题,经查证同事的Activity中对静态变量赋值完全没问题,这就让我纠结了 为什么他的Activity中静态变量正确赋值却在我的Service中获取不到呢?后来上网搜索了原因,各种解释如下:


(e.g.1)如果一个Activity启动另一个组建(Activity/Service)之后关闭其自身,使用System.exit(0)方式的话,等于把这个组建结束了,因此他所操作过的数据都不会再存在了,系统也许认为没有存在的必要了吧,使用finishi();的话,虽然也是退出,但是这个并不是释放资源,只是把当前的Activity推向后台,不再显示,但是他不释放资源,具体资源什么时候释放,由系统决定,当然System.exit(0);这种形式,也并不是真正的退出系统,因为我们还可能有别的Activity在运行,但是他确实把资源释放了。

经测试确实有这样的现象,但是我的Activity并没有 exit或者finish。继续寻找原因...

(e.g.2) static变量如果是不同进程的话也是在service里获取不到的吧

 对于静态变量 在不同 进程之间是不可以共享的。经查证,同事在配置Service中 增加了 android:process=":remote" 也就是说 当启动我这个Service时候 会重新创建一个进程。所以当Activity和Service不在同一个进程中静态变量也就无法共享。所以出现这次的Bug。

在Android开发中不提倡过多使用static类型的变量(除了 static final)因为静态变量生命周期较长,而且不易被系统回收,因此如果不能合理地使用静态变量,就会适得其反,造成大量的内存浪费,所谓过犹不及。因此,建议在具备下列全部条件的情况下,尽量使用静态变量:
(1)变量所包含的对象体积较大,占用内存较多。
(2)变量所包含的对象生命周期较长。
(3)变量所包含的对象数据稳定。
(4)该类的对象实例有对该变量所包含的对象的共享需求。
如果变量不具备上述特点建议你不要轻易地使用静态变量,以免弄巧成拙。
对于全局变量使用Android提供了 Application 其生命周期与应用程序共存亡。所以对于全局变量可以写在 Application。 

抱歉!评论已关闭.