因此,在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,并且作为单例,不能有参数。
如果要使用它来访问某些静态属性,则可以在其中使用:您将只有一个Application实例,因此只需使用为该类指定的名称即可。不必担心它不是实际的单例,可以按相同的方式使用它。
例子:
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.CONSTANT
和MyApp.typeface
。
--
如果要使用它作为应用程序上下文,则可以为Context创建扩展属性:
val Context.myApp: MyApp
get() = applicationContext as MyApp
然后,您可以myApp
在有上下文的任何地方使用来获取应用程序上下文。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句