某些情况下,我们并不能方便的获取上下文环境,因为我们所调用的函数或者类中有时并不存在相关的参数,放心啦,不要尬,安卓为我们提供了一个Applocation类,以便于我们去管理程序内的一些全局的状态信息,比如说全局Context。
首先,我们需要定制一个自己的Applocation类去继承Applocation。示例如下:
public class MyApplication extends Applocation {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
public static Context getContext() {
return context;
}
}
很简单吧,就是重写了父类的onCreate方法,利用函数getApplicationContext()获取了一个应用程序级别的Context,然后提供了一个静态的getContext方法将上述context返回。
程序启动的时候会初始化Application类,我们要告知系统修改其默认做法,转而启动我们自定义的MyApplication类。具体来说就是在AndroidManifest.xml文件的<application>标签下进行指定。代码如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
......
<application
android:name="com.example.test.MyApplication"
......>
......
</application>
</manifest>
需要注意的是,我们需要在该标签中输入你所开发项目的完整的包名。
此外,《第一行代码》这本书中提到了一个很重要的问题:由于每个项目只能有一个Application,当我们使用第三方开源项目如Litepal等对application的配置有需求的资源时,就不能使用上述方法重复配置了,错误的示范如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
......
<application
android:name="com.example.test.MyApplication"
android:name="org.litpal.LitePalApplication"
......>
......
</application>
</manifest>
辣么,要肿么做呢?很简单,在我们自定义的Application中加入对litepal的支持就好了,示例如下:
public class MyApplication extends Applocation {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
LitePalApplication.initialize(context);
}
public static Context getContext() {
return context;
}
}
这样一来,可以实现同样的配置效果,又不会发生冲突哈,棒棒哒!