Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 프로그래머스
- viewBinding
- NestedScrollView
- 레트로핏 코틀린
- 위치정보확인
- 레트로핏2
- Android
- 인텐트란?
- dialog fragment
- 레트로핏 MVVM
- dialogfragment singleton
- recyclerview
- Retrofit Kotlin
- programmers
- 리사이클러뷰
- 다이얼로그 프래그먼트
- 다이얼로그 크기조절
- lifecycleScope
- ScrollView with ConstraintLayout
- Retrofit with MVVM
- dialog resize
- location System
- 쉐어드
- ScrollView Child View Height Programmatically
- java
- 데이터바인딩
- 안드로이드
- DataBinding
- 뷰바인딩
- 스크롤뷰 자식 뷰 높이 동적조절
Archives
- Today
- Total
안드로이드 세계
[Android] WorkManager 특정시간알림 본문
AlarmManager처럼 특정시간을 세팅해준다면 아주편하게 사용할 수 있겠지만, WorkManager는 불가능하다.
따라서 딜레이주는 방식으로 세팅을해주어야하는데, 특정시간을 지정해주는 알고리즘은 다음과같다.
fun getCertainTime(): Long{
val currentDate = Calendar.getInstance()
val dueDate = Calendar.getInstance().apply {
set(Calendar.HOUR_OF_DAY, 2)
set(Calendar.MINUTE, 20)
set(Calendar.SECOND, 0)
}
if (dueDate.before(currentDate))
dueDate.add(Calendar.HOUR_OF_DAY, 24)
return dueDate.timeInMillis - currentDate.timeInMillis
}
워크매니저에는 다음과 같이 세팅해준다.
class WorkApplication : Application() {
private val backgroundCoroutineScope = CoroutineScope(Dispatchers.Default)
override fun onCreate() {
super.onCreate()
delayCreateWork()
}
private fun delayCreateWork(){
backgroundCoroutineScope.launch {
createWorkManager()
}
}
private fun createWorkManager(){
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED)
.setRequiresBatteryNotLow(true)
.setRequiresCharging(true)
.setRequiresStorageNotLow(true)
.build()
val oneTimeWorkRequest = OneTimeWorkRequestBuilder<Worker>().
setInitialDelay(getCertainTime(), TimeUnit.MILLISECONDS).
setConstraints(constraints).build()
WorkManager.getInstance(applicationContext).enqueueUniqueWork(Worker.WORK_NAME, ExistingWorkPolicy.KEEP, oneTimeWorkRequest)
}
}
이렇게만 세팅해주면 일회성세팅이기때문에 워커에도 다음과같이 구성한다.
class Worker(appContext: Context, parameters: WorkerParameters) : CoroutineWorker(appContext, parameters) {
companion object{
const val WORK_NAME = "Notification Work"
}
override suspend fun doWork(): Result {
try {
//Work
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED)
.setRequiresBatteryNotLow(true)
.setRequiresCharging(true)
.setRequiresStorageNotLow(true)
.build()
val oneTimeWorkRequest = OneTimeWorkRequestBuilder<Worker>().
setInitialDelay(getCertainTime(), TimeUnit.MILLISECONDS).
setConstraints(constraints).build()
WorkManager.getInstance(applicationContext).enqueueUniqueWork(Worker.WORK_NAME, ExistingWorkPolicy.REPLACE, oneTimeWorkRequest)
}catch (e: Exception){
Result.retry()
}
return Result.success()
}
}
어떠한 워커작업이 끝나면 다시세팅해준다.
워커에서는 REPLACE로 작업을 세팅해주어야하는데, 그이유는 워커에 등록된 이전 작업이 완전히종료가된상태가 아니기때문이다.
1분마다 세팅한 결과
아래의 깃은 간단하게 로그찍어보는 샘플이다.
https://github.com/pyg1007/WorkManager-Sample
'안드로이드(Android) > 코틀린(Kotlin)' 카테고리의 다른 글
com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable 에러 해결법 (0) | 2021.07.09 |
---|---|
Data Class vs Class (0) | 2021.07.03 |
[Android] WorkManager (0) | 2021.05.31 |
[Android] ScrollView의 Child View Height 문제 (0) | 2021.05.01 |
[Android] Retrofit2 사용법 (0) | 2021.05.01 |
Comments