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


ortant; float: none;" color="#000000" size="3" face="'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', Tahoma, Helvetica, sans-serif, 'Microsoft YaHei', Georgia, Helvetica, Arial, sans-serif, 宋体, PMingLiU, serif"> 在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公用,具有setget方法                           * 程序运行的时候将被创建到进程中                           * @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      ;                                 }                                                      @Override                                 public             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文件中的值的时候跟创建的一样,只不过它会根据名字自动修改,如果没有则创建,否则修改之。
学习跟实战确实不一样,但总结更不一样。学习可能越多越好,实战却是越快越好,交工之后则需要进行优化总结,这个时候考虑的就更多一些了。不过哪个过程都不可或缺,没了学习可能会一叶障目,不能站到巨人的肩膀上;没了实战,学习也就像空中楼阁,总不是自己的;没了总结,则会浅尝辄止,进步不深。


转自:http://cache.baiducontent.com/c?m=9d78d513d9901df918b0cf281a16a6716f5697123bc0a16168a7935f92144c31427192bc30541613a5b66b6671fc0b1eb4ab672171587deb8cc9f85dacb9855f2d9f2644676cf55663a50eaebb5155b637e05afede68f0c9812592dec5a3dc4324cc4474799780ff4d0164dd1ef50345e9b1e94b022b12aeaa703bf003316fdd3441c55ae4a56c3f56dca98a0110d42aa7314fcafa22b04911b112b31f6c7519ff51e1560c732da10974b91f6c1991e15ee22f794225b448b1bac6b0e84887dbe0379df8cfb2&p=882a9546d38a1bfc57efc52b505dc4&newp=867bc64ad4af03e408e2947d0852c6231610db2151d7d0171396d8&user=baidu&fm=sc&query=android+%D0%C5%CF%A2%B7%C5%D4%DAapplication%C0%E0%BA%CD%BE%B2%CC%AC%B1%E4%C1%BF%C7%F8%B1%F0&qid=899db36a0000d941&p1=1

更多相关文章

  1. Android Binder进程间通信-ServiceManager代理对象的获取过程
  2. Qt Ubuntu 配置 Android 环境变量
  3. Android Makefile 具体是 如何识别 TARGET_PRODUCT 变量
  4. Android中如何使用Intent在Activity之间传递对象[使用Serializab
  5. android使用全局变量的两种方法
  6. Android中的全局变量
  7. android 创建系统变量

随机推荐

  1. CentOs7 64位 mysql 5.6.40源码安装过程
  2. Linux下二进制方式安装mysql5.7版本和系
  3. MySQL5.7慢查询日志时间与系统时间差8小
  4. 详解mysql8.018在linux上安装与配置过程
  5. 集群rpm安装MySQL步骤详解
  6. Mysql账户管理原理与实现方法详解
  7. Mysql8.0使用窗口函数解决排序问题
  8. dubbo中zookeeper请求超时问题:mybatis+sp
  9. 解决centos下MySQL登录1045问题
  10. mysql charset=utf8你真的弄明白意思了吗