使用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();