协慌网

登录 贡献 社区

在 Android 中获取 “上下文” 的静态方法?

有没有办法在静态方法中获取当前的Context实例?

我正在寻找那种方式,因为我讨厌每次更改时保存 “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();
}

警告

在将类似上述内容添加到项目之前,您应该考虑文档说的内容:

通常不需要子类 Application。在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。如果你的单例需要一个全局上下文(例如注册广播接收器),那么检索它的函数可以给一个 Context,它在第一次构造单例时在内部使用 Context.getApplicationContext()。


反射

还有另一种使用反射来获取应用程序上下文的方法。在 Android 中经常会忽略反思,我个人认为这不应该用于生产。

要检索应用程序上下文,我们必须在自 API 1 以来可用的隐藏类( ActivityThread )上调用一个方法:

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);
}

快乐的编码!

不,我认为没有。不幸的是,你很难从ActivityContext的其他子类之一调用getApplicationContext() 。此外, 这个问题有些相关。