[안드로이드 스튜디오 코틀린] Application 초기화 하는 방법 with Jetpack
보통 Application에서 instance를 생성해서 onCreate에 초기화하는 방법을 많이 사용한다.
이제 Jetpack을 사용해서 초기화를 해보자 !
기존 방법은 보통 아래처럼 구현해 준다.
import android.app.Application
// Singleton으로 구현 -> Application을 전역적으로 사용해서 어디에서나 접근할 수 있게 함
class ExamApplication : Application() {
override fun onCreate() {
super.onCreate()
instance = this
}
// companion object 를 사용하여 싱글톤 패턴을 구현하고 있음 ->
// 단일 인스턴스(인스턴스 없이)를 전역적으로 접근할 수 있게 함
// 어떤 클래스 내부에 접근하고 싶어 클래스 내부에 객체를 선언할 때 사용함
companion object {
private lateinit var instance: ExamApplication
fun getInstance() = instance
}
}
이제 Jetpack을 사용해서 초기화를 할 수 있다.
Jetpack은 아래처럼 4가지로 구성되어 있는데 위에서 사용할 WorkManager는 Architecture에 속해있다.
WorkManager를 사용해서 초기화를 해줄 것이다.
workmanager를 사용하기 위한 implementation을 추가해 준다.
// Kotlin + coroutines
implementation 'androidx.work:work-runtime-ktx:2.9.0'
(나머지 implemantation은 https://developer.android.com/topic/libraries/architecture/workmanager/basics?hl=ko 참고)
- 2.9.0 이후로는 변수로 override 된다. (이전 버전들은 함수가 override 됨)
AndroidManifest에서는 이렇게 추가해 주고,
(provider에 관한 사이트 : https://developer.android.com/topic/libraries/architecture/workmanager/advanced/custom-configuration?hl=ko)
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<!-- If you are using androidx.startup to initialize other components -->
<meta-data
android:name="androidx.work.WorkManagerInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>
이렇게 Application에 추가하면 된다!
class ExamApplication : Application(), Configuration.Provider {
override val workManagerConfiguration: Configuration = Configuration.Builder()
.setMinimumLoggingLevel(android.util.Log.DEBUG)
.build()
}
Jetpack 구글 예제 sunflower(https://github.com/android/sunflower)에도 보면
이렇게 Application에서 초기화해준 것을 볼 수 있다. (함수와 변수의 차이는 androidx.work의 버전 차이 때문에)
@HiltAndroidApp
class MainApplication : Application(), Configuration.Provider {
override fun getWorkManagerConfiguration(): Configuration =
Configuration.Builder()
.setMinimumLoggingLevel(if (BuildConfig.DEBUG) android.util.Log.DEBUG else android.util.Log.ERROR)
.build()
}
참고
https://developer.android.com/topic/libraries/architecture/workmanager?hl=ko