如果在 Kotlin 与 Java 中声明,用作全局上下文的 MainApplication class 会崩溃

MainApplication class used as a global context crashes if declared in Kotlin vs Java

我在 AndroidManifest.xml

中声明了一个 MainApplication class
    <application
    android:name=".MainApplication" ...other stuffs >

我用作我的应用程序的全局上下文,可在任何 Activity 或 Fragment 之外访问。

如果我将我的 MainApplication class 声明为:

public class MainApplication extends Application {

private static MainApplication instance;

public MainApplication() {
    instance = this;
}

public static MainApplication shared() {
    return instance;
}

}

一切正常,然后我就可以像这样使用它了:

val c = MainApplication.shared()
return c.getSharedPreferences(prefsKey, Context.MODE_PRIVATE)

但是,如果我声明与 Kotlin class 相同的 class 并调用 MainApplication.shared,我会收到一条错误消息,提示我正在对空对象

调用 sharedPreferences
class MainApplication: Application() {
companion object {
    @JvmStatic
    val shared: MainApplication = MainApplication()
}

Kotlin class 声明和单例 (SharedInstances) 是否存在问题,或者我尝试像这样声明此 class 是否出错?

您遇到错误是因为您无法以这种方式实例化应用程序对象。 为了获得应用程序对象,您需要在 AndroidManifest.xml 中使用 android:name 属性

声明它
<application
    android:icon="@mipmap/ic_launcher"
    .
    .
    .
    android:name="your.package.MainApplication">

</application>

为了将应用程序放入 Fragment 中,您可以这样做

val myApplication = requireActivity().application as MainApplication

或 Activity

val myApplication = application as MainApplication

编辑 1 如果想有单例,可以直接在Kotlin中创建

object Foo{
   val bar: String = "Something you want globally"
}

但永远不要将上下文相关的对象放在静态变量中。

问题是您正在创建 Application class 的实例。它应该是这样的:

class MainApplication : Application() {

    override fun onCreate() {
        super.onCreate()

        appContext = applicationContext
    }

    companion object {
        lateinit var appContext: Context
    }
}