大多数希望获得应用程序上下文的方便方法的应用程序都创建了自己的类,该类扩展了android.app.Application.
导轨
您可以通过在项目中首先创建一个类来实现这一点,如下所示:import android.app.Application;import android.content.Context;public class App extends Application {
private static Application sApplication;
public static Application getApplication() {
return sApplication;
}
public static Context getContext() {
return getApplication().getApplicationContext();
}
@Override
public void onCreate() {
super.onCreate();
sApplication = this;
}}
然后,在AndroidManifest中,您应该在AndroidManifest.xml的标记中指定类的名称:
... android:name="com.example.App" >
...
然后,可以使用以下方法在任何静态方法中检索应用程序上下文:public static void someMethod() {
Context context = App.getContext();}
警告
在向项目中添加类似上述内容之前,您应该考虑文档中的内容:通常不需要子类应用程序。在大多数情况下,静态单节点可以更模块化的方式提供相同的功能。如果您的单例需要全局上下文(例如注册广播接收器),那么检索它的函数可以在第一次构造单例时在内部使用Context.getApplicationContext()。
反射
还有一种使用反射获取应用程序上下文的方法。在Android系统中,反射常常被轻视,我个人认为这不应该在生产中使用。
要检索应用程序上下文,我们必须调用隐藏类上的方法(活动线程),从API 1开始提供:public static Application getApplicationUsingReflection() throws Exception {
return (Application) Class.forName("android.app.ActivityThread")
.getMethod("currentApplication").invoke(null, (Object[]) null);}
还有一个隐藏类(AppGlobals),它提供了一种以静态方式获取应用程序上下文的方法。它使用ActivityThread因此,下面的方法和上面发布的方法并没有区别:public static Application getApplicationUsingReflection() throws Exception {
return (Application) Class.forName("android.app.AppGlobals")
.getMethod("getInitialApplication").invoke(null, (Object[]) null);}
编码愉快!