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

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


当前回答

我曾经用过这个:

ActivityThread at = ActivityThread.systemMain();
Context context = at.getSystemContext();

这是一个有效的上下文,我用来获得系统服务和工作。

但是,我只在框架/基础修改中使用它,并没有在Android应用程序中尝试它。

你必须知道的一个警告:当用这个上下文注册广播接收器时,它将不起作用,你将得到:

java.lang.SecurityException:给定的调用程序包android没有在进程ProcessRecord中运行

其他回答

芬兰湾的科特林:

清单:

<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访问该属性

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

public static Context getAppContext()
   return MyApplication.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
}

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

我曾经用过这个:

ActivityThread at = ActivityThread.systemMain();
Context context = at.getSystemContext();

这是一个有效的上下文,我用来获得系统服务和工作。

但是,我只在框架/基础修改中使用它,并没有在Android应用程序中尝试它。

你必须知道的一个警告:当用这个上下文注册广播接收器时,它将不起作用,你将得到:

java.lang.SecurityException:给定的调用程序包android没有在进程ProcessRecord中运行

在Kotlin中,将Context/App Context放在同伴对象中仍然会产生警告,不要将Android Context类放在静态字段中;这是一个内存泄漏(也破坏了即时运行)

或者如果你使用这样的东西:

    companion object {
        lateinit var instance: MyApp
    }

这只是愚弄lint不发现内存泄漏,App实例仍然可以产生内存泄漏,因为Application类及其后代是一个Context。

或者,你可以使用功能界面或功能属性来帮助你获得应用上下文。

简单地创建一个对象类:

object CoreHelper {
    lateinit var contextGetter: () -> Context
}

或者你可以使用nullable type更安全:

object CoreHelper {
    var contextGetter: (() -> Context)? = null
}

在你的App类中添加这一行:


class MyApp: Application() {

    override fun onCreate() {
        super.onCreate()
        CoreHelper.contextGetter = {
            this
        }
    }
}

在你的manifest中声明应用名。MyApp


    <application
            android:name=".MyApp"

当你想获取上下文时,只需调用:

CoreHelper.contextGetter()

// or if you use the nullable version
CoreHelper.contextGetter?.invoke()

希望能有所帮助。