在Android中获取“上下文”的静态方法?
有没有办法在静态方法中获取当前的Context
实例?
我正在寻找这种方式,因为我讨厌每次更改时都保存“上下文”实例。
做这个:
在Android Manifest文件中,声明以下内容。
<application android:name="com.xyz.MyApplication">
</application>
然后写下课程:
public class MyApplication extends Application {
private static Context context;
public void onCreate() {
super.onCreate();
MyApplication.context = getApplicationContext();
}
public static Context getAppContext() {
return MyApplication.context;
}
}
现在,无处不在调用MyApplication.getAppContext()
静态获取应用程序上下文。
大多数需要方便的方法来获取应用程序上下文的应用程序都会创建自己的扩展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的标签中指定您的类的名称:
<application
...
android:name="com.example.App" >
...
</application>
然后,您可以使用以下方法在任何静态方法中检索应用程序上下文:
public static void someMethod() {
Context context = App.getContext();
}
警告
在向您的项目中添加类似上面的内容之前,您应该考虑文档所说的内容:
通常不需要子类化应用程序。 在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。 如果你的单例需要一个全局上下文(例如注册广播接收者),那么检索它的函数可以被赋予一个上下文,该上下文在第一次构造单例时在内部使用Context.getApplicationContext()。
反射
还有另一种使用反射来获取应用程序上下文的方法。 反思在Android中经常被忽视,我个人认为这不应该用于生产。
为了检索应用程序上下文,我们必须调用一个隐藏类(ActivityThread)上的方法,该方法从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);
}
快乐的编码!
不,我认为没有。 不幸的是,你坚持从Activity
或Context
的其他子类之一调用getApplicationContext()
。 另外,这个问题有些相关。