Kotlin SingleTon应用程序类

所以在Android我想让我的应用程序类单身人士。

像这样做:

object MyApplication: Application(){} 

将无法工作。 在运行时抛出以下错误:

 java.lang.IllegalAccessException: private com....is not accessible from class android.app.Instrumentation. 

这样做也是不可能的:

 class MyApp: Application() { private val instance_: MyApp init{ instance_ = this } override fun onCreate() { super.onCreate() if (BuildConfig.DEBUG) { Timber.plant(Timber.DebugTree()); } } companion object{ fun getInstance() = instance_ } } 

那么如何在我的应用程序中的任何地方获得我的应用程序类的实例,想使用MyApp.instance()而不是(applicationContext as MyApp)

另外一个解释,为什么我想这样做:我有我的应用程序中的类,例如,一个SharedPreference单一的上下文初始化,作为一个单身,不能有参数。

如果你想使用它来访问你在那里的一些静态属性 :你将只有一个你的应用程序的实例,所以只需使用你给这个类的名字。 不要担心它不是一个真正的单身人士,你可以用同样的方式。

例:

 class MyApp : Application() { companion object { const val CONSTANT = 12 lateinit var typeface: Typeface } override fun onCreate() { super.onCreate() typeface = Typeface.createFromAsset(assets, "fonts/myFont.ttf") } } 

然后,您可以在应用程序的任何位置使用MyApp.CONSTANTMyApp.typeface

如果您想要将其用作应用程序上下文 ,则可以为上下文创建扩展属性:

 val Context.myApp: MyApp get() = applicationContext as MyApp 

然后,您可以使用myApp在任何有上下文的地方获取应用程序上下文。

你可以做同样的事情,你会在Java中,即把Application实例放在一个静态的字段。 Kotlin没有静态字段,但对象中的属性是静态可访问的。

 class MyApp: Application() { override fun onCreate() { super.onCreate() instance = this } companion object { lateinit var instance: MyApp private set } } 

然后您可以通过MyApp.instance访问该属性。

你不能这样做,因为Android使用无参数的构造函数创建一个Application实例。

您想要解决的问题可以通过DI轻松解决。 只需使用注入器创建实例,以便Context可以作为依赖项注入到对象中。