您的位置:首页 > 移动开发 > Android开发

Android中Application、静态变量和Sharedpreferences的使用与区别

2015-09-25 11:39 656 查看


转自 http://wlccomeon.blog.163.com/blog/static/18177204020154129584706/

Android中Application、静态变量和Sharedpreferences的使用与区别

在Android中,并没有一种类似于Web开发中常用的Session功能,但在开发中我们肯定经常用到,所以只能找它的取代方法了。

目前我用到的大概有3种:

1. 使用静态全局变量(值变量)

2. 使用自定义的Application

3. 使用Sharedpreferences

下面逐一介绍:

一、静态变量

说实话,在Java中,静态全局变量特别好用,我们在需要的地方直接调用即可,不用new。静态变量的生命周期伴随着类的加载与卸载而产生与销毁。而类的生命周期又是跟程序的进程执行是同步的。所以,静态全局变量就会在内存中一直存在。静态变量是不会被垃圾回收的,其对象会一直保持引用,故需要自己释放静态变量。

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

静态变量的使用,也有可能会造成OOM(out of memory)的问题。下面看一段代码:

private static Resources mResources;   @Override  protected void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);       setContentView(R.layout.activity_main);      if (mResources == null) {		mResources = this.getResources();	}  }


这段代码中有一个静态的Resources对象。代码片段mResources = this.getResources()对Resources对象进行了初始化。这时Resources对象拥有了当前Activity对象的引用,Activity又引用了整个页面中所有的对象。如果当前的Activity被重新创建(比如横竖屏切换,默认情况下整个
Activity会被重新创建),由于Resources引用了第一次创建的Activity,就会导致第一次创建的Activity不能被垃圾回收器回 收,从而导致第一次创建的Activity中的所有对象都不能被回收。这个时候,一部分内存就浪费掉了,甚至有可能造成OOM的问题。

那么解决方法是什么呢?只需如此即可:mResources = this.getApplication().getResources();在这里将this.getResources()修改为
this.getApplication().getResources()。修改以后,Resources对象拥有的是Application对象的引 用。如果Activity被重新创建,第一次创建的Activity就可以被回收了。

从设计角度来看,静态变量的使用会直接暴露类的内部结构。如果在其他类中被任意修改,程序肯定会乱。所以,在Android中,应该尽量减少静态变量的使用,并且最好使用一个公共的类,将静态变量统一管理起来。

二、Application

Application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以可以通过Application来进行一些,如:数据传递、数据共享和数据缓存等操作。由于Android的特点,它也有可能会被置空,但在全局变量的使用上来说,它不会产生如上面的静态变量中的例子那样的后果,而且它是谷歌推荐的使用方式,比静态变量要好。

目前,我对它的使用还仅限于类似于Web开发中的Session功能,还得需要我们手动去实现:

①添加自定义的Application类,继承Application,并重写onCreate方法:

/*** 全局变量类* 用于多个Activity公用,具有set和get方法* 程序运行的时候将被创建到进程中* @author wlc* @date 2015-4-13*/public class GlobalVariable extends Application {private String userName;public String getUserName() {	return userName;}public void setUserName(String userName) {	this.userName = userName;}@Overridepublic void onCreate() {	super.onCreate();}


②在App的AndroidManifest.xml文件中找到application标签,添加上面的类所在的空间,这样app在启动的时候就会产生自定义的这个Application:

android:name=".ui.GlobalVariable"


③赋值方式:

GlobalVariable userApplication = (GlobalVariable) getApplication();userApplication.setUserName("lc");


④取值方式:

GlobalVariable userGlobalVariable = (GlobalVariable) getApplication();String userName = userGlobalVariable.getUserName();


这个例子只是作为一个变量的修改与获取,当然还可以做其他初始化的操作等等,如:

MmsConfig.init(this);      Contact.init(this);      DraftCache.init(this);      Conversation.init(this);       …… //很多init


三、Sharedpreferences

Sharedpreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置。其本质是xml文件,这个优点就很明显了:它不会产生上面提到的内存和空指针问题。缺点是效率没有上面的两种方法高。它提供了java常规的Long、Int、String等类型数据的保存接口。类似过去Windows系统上的ini配置文件,但是它分为多种权限,可以全局共享访问。使用方式如下:

①创建并添加值

// 初始化功率SharedPreferences mySharedPreferences = getSharedPreferences("power", 0);mySharedPreferences.edit().putInt("power", 26).commit();


在我们的将会创建出该xml文件:

②获取值

SharedPreferences sharedPreferences = getSharedPreferences("power", 0);int power = sharedPreferences.getInt("power", 0);


③修改值

SharedPreferences sharedPreferences = getSharedPreferences("power", 0); int power = sharedPreferences.getInt("power", 0);  sharedPreferences.edit().putInt("power", power).commit();


修改xml文件中的值的时候跟创建的一样,只不过它会根据名字自动修改,如果没有则创建,否则修改之。

学习跟实战确实不一样,但总结更不一样。学习可能越多越好,实战却是越快越好,交工之后则需要进行优化和总结,这个时候考虑的就更多一些了。不过哪个过程都不可或缺,没了学习可能会一叶障目,不能站到巨人的肩膀上;没了实战,学习也就像空中楼阁,总不是自己的;没了总结,则会浅尝辄止,进步不深。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: