だから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_
}
}
_
それで、アプリのあらゆる場所でアプリケーションクラスのインスタンスを取得するには、_(applicationContext as MyApp)
_の代わりにMyApp.instance()
を使用したいと思います。
また、これが必要な理由の説明:アプリにクラスがあります。たとえば、コンテキストで初期化され、そのシングルトンとして引数を持つことができないSharedPreferenceシングルトンです。
静的プロパティにアクセスするために使用必要な場合:アプリケーションのインスタンスは1つだけなので、クラスに付けた名前を使用します。実際のシングルトンではないことを心配しないでください。同じように使用できます。
例:
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
を使用して、コンテキストがある場所であればどこでもアプリケーションコンテキストを取得できます。
Javaで行うのと同じことを実行できます。つまり、Application
インスタンスを静的フィールドに配置します。 Kotlinには静的フィールドはありませんが、オブジェクトのプロパティには静的にアクセスできます。
class MyApp: Application() {
override fun onCreate() {
super.onCreate()
instance = this
}
companion object {
lateinit var instance: MyApp
private set
}
}
その後、MyApp.instance
を介してプロパティにアクセスできます。
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()
}
}
Androidはパラメーターなしのコンストラクターを使用してApplication
インスタンスを作成するため、これを行うことはできません。
解決したい問題は、DIで簡単に解決できます。 Context
を依存関係としてオブジェクトに注入できるように、インジェクターでインスタンスを作成するだけです。