代码改变世界

使用Application变量

2011-04-02 17:07  乱世文章  阅读(530)  评论(0编辑  收藏  举报

 

如何在多个Activity中共享数据?Android中有Application变量吗?听起来象是在说Asp(Asp也有所谓的Application变量)。

如果你想在多个Activity之间共享一组电话号码,你可以用xml资源文件,也可以用SharedPreferences。

Application变量其实不仅仅是变量,他其实是对象,也就是说可以在应用程序的多个Activity间共用代码(方法)。

例如,我有一个获取本机号码的方法,想让所有的类中都能方便地调用它。你也许会说,创建一个工具类好了。没错,我准备把它封装在单独的类里。

但仅仅这样还不够。因为普通的类你怎么获得一个Context?Android SDK中有大量方便的方法,都需要Context来调用,比如 getSystemService 方法(这个例子里面就要用到),又比如 getSharedPreferences 方法,经常用来获取应用程序共享数据,又比如 getString 方法,我们用来读取xml资源中定义的字符串,等等。

我们平时使用 Context的时候很方便,那是因为Activity已经为我们准备好了。

而作为工具类,通常不需要界面,因此它不可能继承自Activity。

你又会说,我们可以通过方法参数传递一个Context进去。就目前为止,我们所知道的Context只有Activity和它的子类。但调用我们的工具类的很可能根本不是一个Activity子类,它又怎么获得一个Context来传递给参数呢?同样问题又出现了,我们依然没有解决它。

那么我们就束手待毙了吗?

我们没有其他更多的选择,只能使用Application变量。

1、AndroidManifest.xml

又是AndroidManifest.xml。这东东可以说是太重要了,我们随时都需要用到它。

首先,在<application>标签中申明属性:

android:name = "ydtf.pm.Utils"

我们定义了一个Application变量ydtf.pm.Utils。说是变量,其实更象是一个类名。没错,它就是我们接下来要实现的工具类。

说它是变量,是因为这样声明了之后Utils类会获得一个本应用程序的Context引用。

这有点象Spring IoC(依赖注入)?或者是AOP(象AOP一样给Utils对象增加一个属性)?

我不知道怎么形容它,反正你看接下来的代码就知道了。

2、Utils.java

 

public class Utils extends Application {

private static Utils instance ;

private SharedPreferences settings ;

private Context ctx ;

public static Utils getInstance(){

return instance ;

}

@Override

    public void onCreate() {

        // TODO Auto-generated method stub

        super .onCreate();

        instance = this ;

        ctx = this .getBaseContext();

    }

// 获取 sim 卡手机号 <uses-permission android:name="android.permission.READ_PHONE_STATE" />

public String getLocalTelNo(){

// 取得手机服务

TelephonyManager tm = (TelephonyManager) ctx .getSystemService(Context. TELEPHONY_SERVICE );

return tm.getLine1Number();

}

}

代码很简单的,只需要注意那么几点。

1、继承Application

既然是Application变量,当然要继承自Application,因为<application>标签规定 android:name 属性中的东西必须是Application子类。此外,Application象Activity一样,提供了获得“免费”Context的方法getBaseContext()。

2、覆盖onCreate()方法

onCreate()方法实际上是Application的初始化方法,当构造方法被调用之后接着被调用。因此我们需要在这里获得必要的东西,比如Context。于是:

ctx = this .getBaseContext();

3、使用Context

这样在接下来的实例方法中,我们就有“免费”的Context使用了,就如getLocalTelNo所做的:

ctx .getSystemService(Context. TELEPHONY_SERVICE );

4、在其他的类中使用Utils:

跟一般的类一样使用它:

String number=Utils.getInstance().getLocalTelNo();