是否有一种方法来获得静态方法内的当前上下文实例?

我正在寻找这种方式,因为我讨厌保存'Context'实例每次它改变。


当前回答

如果你不想修改清单文件,你可以手动将上下文存储在初始活动的静态变量中:

public class App {
    private static Context context;

    public static void setContext(Context cntxt) {
        context = cntxt;
    }

    public static Context getContext() {
        return context;
    }
}

当你的activity(或多个activity)开始时,只需设置上下文:

// MainActivity

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Set Context
    App.setContext(getApplicationContext());

    // Other stuff
}

注意:与所有其他答案一样,这是一个潜在的内存泄漏。

其他回答

我认为你需要一个getAppContext()方法的主体:

public static Context getAppContext()
   return MyApplication.context; 

这取决于您使用上下文的目的。我认为这种方法至少有一个缺点:

如果您正在尝试使用AlertDialog创建AlertDialog。Builder,应用程序上下文将无法工作。我相信你需要了解当前活动的背景……

你可以使用以下方法:

MainActivity.this.getApplicationContext();

MainActivity.java:

...
public class MainActivity ... {
    static MainActivity ma;
...
    public void onCreate(Bundle b) {
         super...
         ma=this;
         ...

任何其他类:

public ...
    public ANY_METHOD... {
         Context c = MainActivity.ma.getApplicationContext();

大多数想要一个方便的方法来获取应用上下文的应用程序都会创建自己的类来扩展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);
} 

编码快乐!

如果你不想修改清单文件,你可以手动将上下文存储在初始活动的静态变量中:

public class App {
    private static Context context;

    public static void setContext(Context cntxt) {
        context = cntxt;
    }

    public static Context getContext() {
        return context;
    }
}

当你的activity(或多个activity)开始时,只需设置上下文:

// MainActivity

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Set Context
    App.setContext(getApplicationContext());

    // Other stuff
}

注意:与所有其他答案一样,这是一个潜在的内存泄漏。