Android - Kotlin:在扩展应用程序的 class 中实例化一个对象,并在所有活动中使用它

Android - Kotlin : Instantiate an object once inside the class that extends application and use it in all activities

我的目标是在 class 中实例化一个扩展应用程序 class 的对象,然后在所有活动中静态使用它,es:

假设我们有一个class要静态使用或与单例模式一起使用

class MyObject( arg1: Any){

   fun OneFunction(){
     .....
   }

}

假设我们在Manifest中声明了名为App的应用程序(从而创建扩展Application()的Appclass)


class App : Application(){

 override fun onCreate() {
        super.onCreate()

  }

}

目标是能够在任何 activity

中静态使用该对象

class MainActivity : AòppCompactActivity(){
     override fun onCreate(savedInstanceState: Bundle?) {
         MyObject.OneFunction()
     }
}

在您的简单情况下,您实际上缺少一个 class,它将充当全局可访问的对象实例容器。

class MyObject(arg1: Any){
   fun oneFunction() {
       // ...
   }
}    

class App : Application() {
   override fun onCreate() {
      super.onCreate()
      Deps.myObject = MyObject(Any())
   }
}

其中Deps

object Deps {
    lateinit var myObject: MyObject
}

然后

class MainActivity : AppCompactActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         Deps.myObject.oneFunction()
     }
}

在 MyObject 中创建 companion 并在 Application 的重写中实例化 class

class MyObject : App() { //extends your App or in-build Application 

override fun onCreate() {
    super.onCreate()
    instance= this
}

fun oneFunction() {
    // ...
}
companion object{
    lateinit var instance: MyObject
}
} 

在任何activity

中都这样使用
MyObject.instance.oneFunction();

在你的解决方案之前,我使用的是 SingletonHolder 模式

open class SingletonHolder<out T, in A>(private val constructor: (A) -> T) {

    @Volatile
    private var instance: T? = null

    fun getInstance(arg: A): T {
        return when {
            instance != null -> instance!!
            else -> synchronized(this) {
                if (instance == null) instance = constructor(arg)
                instance!!
            }
        }
    }
}


class MyManager private constructor(context: Context) {

    fun doSomething() {
        ...
    }

    companion object : SingletonHolder<MyManager, Context>(::MyManager)
}

以及内部活动:

MyManager.getInstance(context).doSomething()