所以在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 Singleton,并且作为它的单例,不能有参数 .
4 回答
如果你想要 use it to access some static properties :你只有一个你的应用程序实例,所以只需使用你给这个类的名字 . 不要担心它不是一个真正的单身人士,你可以用同样的方式使用它 .
例:
然后,您可以在应用中的任何位置使用
MyApp.CONSTANT
和MyApp.typeface
.如果您想要的是 to use it as an application context ,您可以为Context创建扩展属性:
然后,您可以使用
myApp
在任何有上下文的位置获取应用程序上下文 .您可以执行与在Java中执行的操作相同的操作,即将
Application
实例放在静态字段中 . Kotlin没有静态字段,但对象中的属性是静态可访问的 .然后,您可以通过
MyApp.instance
访问该 properties .您不能这样做,因为Android使用其无参数构造函数创建
Application
实例 .您想要解决的问题可以通过DI轻松解决 . 只需使用注入器创建实例,以便
Context
可以作为依赖项注入对象 .