Kotlin Singleton Application Class

前端 未结 4 801
梦毁少年i
梦毁少年i 2021-01-31 07:56

So in android i want to make my application class a singleton.

Making it like this:

object MyApplication: Application(){}

won\'t work.

相关标签:
4条回答
  • 2021-01-31 08:32

    You cannot do that because Android creates an Application instance using its parameterless constructor.

    The problem you want to solve can be easily solved with DI. Just create instances with an injector so that the Context can be injected into objects as a dependency.

    0 讨论(0)
  • 2021-01-31 08:35

    You can do the same thing you would do in Java, i.e. put the Application instance in a static field. Kotlin doesn't have static fields, but properties in objects are statically accessible.

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

    You can then access the property via MyApp.instance.

    0 讨论(0)
  • 2021-01-31 08:36

    If you want to use it to access some static properties you have there: You will only have one instance of your Application, so simply use the name you gave to the class. Don't worry about it not being an actual singleton, you can use it the same way.

    Example:

    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")
        }
    
    }
    

    Then you can use MyApp.CONSTANT and MyApp.typeface anywhere in your app.

    -

    If what you want is to use it as an application context you can create an extension property for Context:

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

    Then you can use myApp to get the the application context anywhere you have a context.

    0 讨论(0)
  • 2021-01-31 08:51
        class AppController : Application() {
    
            init {
                instance = this
            }
    
            companion object {
                private var instance: AppController? = null
    
                fun applicationContext() : AppController {
                    return instance as AppController
                }
            }
    
            override fun onCreate() {
                super.onCreate()
            }
        }
    
    0 讨论(0)
提交回复
热议问题