是否有一种方法来获得静态方法内的当前上下文实例?
我正在寻找这种方式,因为我讨厌保存'Context'实例每次它改变。
是否有一种方法来获得静态方法内的当前上下文实例?
我正在寻找这种方式,因为我讨厌保存'Context'实例每次它改变。
当前回答
不,我想没有。不幸的是,您只能从Activity或Context的其他子类调用getApplicationContext()。而且,这个问题有点相关。
其他回答
这样做:
在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();
}
警告
在向你的项目添加上述内容之前,你应该考虑一下文档中的内容:
通常不需要子类化Application。在大多数情况下, 静态单例可以以更模块化的方式提供相同的功能 道路如果你的单例需要一个全局上下文(例如注册 广播接收器),检索它的函数可以给出一个 在内部使用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);
}
编码快乐!
我认为你需要一个getAppContext()方法的主体:
public static Context getAppContext()
return MyApplication.context;
芬兰湾的科特林:
清单:
<application android:name="MyApplication">
</application>
MyApplication.kt
class MyApplication: Application() {
override fun onCreate() {
super.onCreate()
instance = this
}
companion object {
lateinit var instance: MyApplication
private set
}
}
然后,您可以通过MyApplication.instance访问该属性
罗希特的回答似乎是正确的。然而,据我所知,AndroidStudio的“即时运行”依赖于在你的代码中没有静态上下文属性。