学习Android开发有一段时间了,一直没有总结写点文章,一来是网上相关的技术文章已经很多了,难以写出新意;另一方面,想多积累多沉淀一些,随着学习的加深,慢慢总会发现前面掌握的知识比较片面,许多功能的实现,总能找到更好的解决方案。


今天开始我的Android开发笔记的第一篇文章吧,写一点Android开发过程中掌握的一些小技巧,有的是自己总结出来的,有的是从其他人的博客中学到的,也有一些是在一些开源的Android项目中见到的,分享在此,供初学者借鉴,也欢迎留言探讨。


在开发过程中,我们经常会需要用到一些全局的变量或者全局的“管理者”,例如QQ,需要有一个“全局的管理者“保存好友信息,各个activity即可直接通过该”管理者“来获取和修改某个好友信息,显然,这样的一个好友信息,保存到某一个具体的activity里面,然后依靠activity的intent来传递参数是不合适。我们有两种方法来实现这样一个全局的管理者,一种是使用C++/Java中常用的单例模式,另一种是利用Android的Application类,下面一一阐述。


单例模式在面向对象的开发中很常见,我也不详细描述,简单地给出实现的代码示例吧:


public class QQInfoManager {
    private static final QQInfoManager mInstance = new QQInfoManager();
      
    private QQInfoManager() {
    }
    public static QQInfoManager getInstance() {
        return mInstance;
    }
    public boolean funcA() {
        return true;
    }
                                                                                                                                                       
    ......
}

各个activity想要使用该类对象,通过QQInfoManager.getInstance() 来使用即可。


唯一要说明的就是这种单例模式的实现方式与下面这种单例模式的实现方式的区别:


public class QQInfoManager {
                                                             
    private static QQInfoManager mInstance = null;
                                                       
    public static QQInfoManager getInstance() {
                                                     
        if(mInstance==null) {
            mInstance = new QQInfoManager();
        }
        return mInstance;
    }
                                                           
    public boolean funcA() {
       return true;
  }
}


第二种单例模式的实现思路,是在第一次使用该类对象的时候来才创建,这样的好处在于节省程序启动动时间和内存空间,如果程序运行过程中一直没有使用该类对象,则内存中不会创建该对象。而第一种方式在程序启动的时候就在内存中创建好了该对象,直到程序结束。但是,第二种方式也有弊端,它并不是线程安全的,在多线程中,如果两个线程同时第一次使用该类对象,则可能会产生意想不到的结果。


下面说下Application方式的实现。


Application类是Android提供的保存全局变量的类,其实该类的onCreate方法是整个Android程序真正的入口。该类对象会在程序启动时被创建,直到程序结束。我们可以通过继承该类来实现全局数据的管理,同时,也可以通过重载该类的方法,在程序的各个生命期插入我们期望的代码。


import android.app.Application;
public class QQApplication extends Application {
                                                                                                                                
        @Override
        public void onCreate() {
            //应用程序启动时被系统调用
        }
                                                                                                                                 
        @Override
        public void onTerminate() {
            //应用程序退出时会被系统调用
        }
                                                                                                                                 
        //示例函数
        public boolean funcA(){
           return true;
       }
}


这样定义了还不够,还需要到工程的 AndroidManifest.xml中,在 <application> 标签中,添加一项:


android:name=".QQApplication"


这样定义以后 ,即可在程序的各个activity中使用了,使用方法示例如下:


//获取application对象
QQApplication app = (QQApplication)getApplicationContext();
                                                                                                                                                  
//调用方法
app.funcA();


下面再谈一谈使用 Application和 Instance 的区别:


Application对象只能用在activity中,因为 getApplicationContext方法是需要一个Context类型的this指针,一般的java对象不包含这个Context类对象。


整个程序的Application对象只有一个,而Java的单例模式的类可以有很多个,在业务逻辑比较复杂的应用中,全部使用一个Application 类对象来管理全局信息其实并不合适。


Application类本身也属于Context的子类,所以该对象可以向上转型为Context类型,该类可以直接使用Android提供的各种服务,如:getSystemService(Context.CONNECTIVITY_SERVICE);  getSystemService函数需要Context对象才能调用,普通的Java类无法直接使用。


比较建议的使用方法是,如果需要全局类来保存数据,尽量 使用单例模式的 Java类,而Application类对象以用来管理各个全局的单例Java类对象,比如初始化和资源清理,以及传递this指针(Context类对象)给这些Java类来使用系统的服务。


关于 Application 和Instance 的使用小技巧就说到这儿了,不够清楚的地方欢迎留言讨论或者邮件lujun.hust@gmail.com交流,或者关注我的新浪微博 @卢_俊 获取最新的文章和资讯。