HiltWorker로 Worker에 의존성 주입받기
우선 필요한 dependency는 다음과 같다.
Coroutine은 예시에서 CoroutineWorker
를 만들 것이기때문에 넣어주었다.
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.1"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1'
implementation "com.google.dagger:hilt-android:2.38.1"
kapt "com.google.dagger:hilt-android-compiler:2.38.1"
implementation("androidx.hilt:hilt-work:1.0.0")
kapt("androidx.hilt:hilt-compiler:1.0.0")
implementation "androidx.work:work-runtime:2.6.0"
implementation "androidx.work:work-runtime-ktx:2.6.0"
Worker에 의존성 주입을 하기 위해서 @HiltWorker
Annotation을 이용할 수 있다.
@HiltWorker
class FCMWorker @AssistedInject constructor(
@Assisted context: Context,
@Assisted workerParameters: WorkerParameters,
private val db: Database
) : CoroutineWorker(context, workerParameters) {
// ...
}
예시에는 Database라는 클래스를 주입받고있는데, SingletonComponent
들만 Worker에 주입받을 수 있다.
Worker는 setWorkerFactory()
를 통해서 설정할 수 있는 HiltWorkerFactory를 통해 생성이 되는데, Application 클래스에서 다음과 같이 설정할 수 있다.
@HiltAndroidApp
class MyApplication : Application(), Configuration.Provider {
@Inject lateinit var workerFactory: HiltWorkerFactory
override fun getWorkManagerConfiguration(): Configuration {
return Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
}
}
Could not create Worker 해결방법
이렇게 까지만 하면 Could not create Worker
오류가 생기면서 Worker가 제대로 돌아가지 않을 것이다. AndroidManifest.xml
에 provider
를 하나 추가해주면된다.
<application>
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove" />
</application>
ProcessLifecycleOwner가 작동하지 않는 문제
Application에 ProcessLifecycleOwner
를 이용해서 Foreground 체크를 하는 코드가 있었는데, Worker를 추가하니 작동이 안되었다. 뭘까...하고찾아봤는데 ProcessLifecycleOwner
초기화가 androidx.startup
을 사용하는 것으로 바뀌었다고한다.
아까 추가한 provider에서 tools:node="remove"
가 AndroidX StartUp 프로세스를 비활성화 하므로 ProcessLifecycleOwner
가 초기화되지 않게된다.
tools:node="remove"
대신에, tools:node="merge"
로 바꿔주면 작동하게 된다. 하지만 아마도 Release 빌드에는 실패할텐데, Remove androidx.work.WorkManagerInitializer from your AndroidManifest.xml when using on-demand initialization. 라고 경고할거다. WorkManagerInitializer에는 remove를 사용할 수 있도록 수정해준다.
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="androidx.work.WorkManagerInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>
참고자료
'프로그래밍 > Android' 카테고리의 다른 글
Android Studio 이전 릴리즈 다운받는 방법 (3) | 2022.09.29 |
---|---|
[안드로이드] 예제로 보는 NavigationComponent (2) | 2022.09.18 |
[안드로이드] WorkManager Worker 디버깅하기 (0) | 2022.09.13 |
[안드로이드] View를 터치 입력에 따라 회전하기 (핸들 구현) (0) | 2022.08.24 |
[안드로이드] 실시간 네크워크 상태 callbackFlow를 이용해 만들어보자! (Youtube 인터넷 연결처럼 구현) (0) | 2022.08.13 |