#1 ์ด์ ๊ธ
[Android] WorkManager - ๊ธฐ์ด
#1 ์ด์ ๊ธ [Android] WorkManager - ๊ฐ์#1 WorkManager๋ '์ง์ฐ ๊ฐ๋ฅํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ '์ ๊ด๋ฆฌ์ WorkManager๋ฅผ ์ฌ์ฉํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ - Kotlin | Android DevelopersAndroid์๋ ๋ณด์ฅ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ํ ๋ค
kenel.tistory.com
์ ๊ฒ์๊ธ์ ์์ฑ๋ ์ฑ์ ์ผ๋ถ ์์ ํด์, WorkRequest์ ์ด๋ฆ์ ๋ถ์ด๊ณ , ์์ ์ ๊ด๋ฆฌํด๋ณธ๋ค.
#2 ์ฝ๋ ์์ - MainActivity.kt
...
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
...
}
private fun setOneTimeWorkRequest() {
// WorkRequest ๊ฐ์ฒด ๋ง๋ค๊ธฐ
val uploadRequest = OneTimeWorkRequest
.Builder(UploadWorker::class.java)
.build()
// WorkManager ๊ฐ์ฒด์ ์์
ํ(Job queue)์ WorkRequest ๋ฑ๋ก
/* ๊ณผ๊ฑฐ์ enqueue()ํ์๋ ๋์ผํ '๊ณ ์ ์ด๋ฆ(์ฌ๊ธฐ์๋ "myWork1")'์ธ ์์
์ '1st ์์
',
* ์ง๊ธ enqueue()ํ๋ ค๋ ์์
์ '2nd ์์
'์ด๋ผ๊ณ ํ ๋,
*
* ExistingWorkPolicy.APPEND: 1st ์์
์ ์ทจ์ํ์ง ์๊ณ ๊ทธ ๋ท ์์๋ก 2nd ์์
์ ์ด์ด ๋ถ์ (Chaining Worker์์์ ๊ฐ์ ๋์. ์ฐธ์กฐ: https://kenel.tistory.com/153)
* ExistingWorkPolicy.APPEND_OR_REPLACE:
* 2nd ์์
์ด enqueue()๋๋ ์์ ์, 1st ์์
์ ์ํ๊ฐ FAILED๋ฉด 2nd ์์
์์ (REPLACE์ ๊ฐ์ ๋์)
* 2nd ์์
์ด enqueue()๋๋ ์์ ์, 1st ์์
์ด ์์ง ์๋ฃ(= SUCCEEDED๋ FAILED๋ ์๋)๋์ง ์์๋ค๋ฉด ๊ทธ ๋ท ์์๋ก 2nd ์์
์ ์ด์ด ๋ถ์ (APPEND์ ๊ฐ์ ๋์)
* ExistingWorkPolicy.KEEP: ์๋ฌด๊ฒ๋ ํ์ง ์์ (2nd ์์
์คํ ์๋จ)
* ExistingWorkPolicy.REPLACE: 1st ์์
์ Cancelํ๊ณ 2nd ์์
์์
*/
workManager.enqueueUniqueWork("myWork1", ExistingWorkPolicy.APPEND_OR_REPLACE, uploadRequest)
// WorkInfo๋ ์์
์ ๋ํ ์ ๋ณด๋ฅผ ๋ด์ ๊ฐ์ฒด.
// WorkManager.getWorkInfoByIdLiveData()๋ LiveData<WorkInfo>๋ฅผ ๋ฐํ.
val workInfo = workManager.getWorkInfoByIdLiveData(uploadRequest.id)
workInfo.observe(this, Observer {
Log.i("interfacer_han", "(${this::class.simpleName}) UploadWorker's state: ${it.state.name}")
})
}
private fun setPeriodicWorkRequest() {
// WorkRequest ๊ฐ์ฒด ๋ง๋ค๊ธฐ
val downloadRequest = PeriodicWorkRequest
.Builder(DownloadWorker::class.java, 15, TimeUnit.MINUTES) // ์๋๋ก์ด๋์์ ํ์ฉํ๋ PeriodicWorkRequest์ ์ต์ ์ฃผ๊ธฐ๋ 15๋ถ์ด๋ค.
.build()
// WorkManager ๊ฐ์ฒด์ ์์
ํ(Job queue)์ WorkRequest ๋ฑ๋ก
/* ๊ณผ๊ฑฐ์ enqueue()ํ์๋ ๋์ผํ '๊ณ ์ ์ด๋ฆ(์ฌ๊ธฐ์๋ "myWork2")'์ธ ์์
์ '1st ์์
',
* ์ง๊ธ enqueue()ํ๋ ค๋ ์์
์ '2nd ์์
'์ด๋ผ๊ณ ํ ๋,
*
* ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE: 1st ์์
์ Cancelํ๊ณ 2nd ์์
์์
* ExistingPeriodicWorkPolicy.KEEP: ์๋ฌด๊ฒ๋ ํ์ง ์์ (2nd ์์
์คํ ์๋จ)
* ExistingPeriodicWorkPolicy.UPDATE:
* 1st ์์
์ ์ทจ์ํ์ง ์๊ณ ,
* ์์
์ Parameter (์ฐธ์กฐ: https://kenel.tistory.com/152)๋
* Constraint(์ฐธ์กฐ: https://kenel.tistory.com/151)๊ฐ
* 2nd ์์
์ ๊ฒ์ผ๋ก ์
๋ฐ์ดํธ๋จ. ๋์ 2nd ์์
์ ์คํ ์๋จ
* ExistingPeriodicWorkPolicy.REPLACE: Deprecated๋จ. ๋์ UPDATE๋ฅผ ์ฌ์ฉํ ๊ฒ
*/
workManager.enqueueUniquePeriodicWork("myWork2", ExistingPeriodicWorkPolicy.UPDATE, downloadRequest)
// WorkInfo๋ ์์
์ ๋ํ ์ ๋ณด๋ฅผ ๋ด์ ๊ฐ์ฒด.
// WorkManager.getWorkInfoByIdLiveData()๋ LiveData<WorkInfo>๋ฅผ ๋ฐํ.
val workInfo = workManager.getWorkInfoByIdLiveData(downloadRequest.id)
workInfo.observe(this, Observer {
Log.i("interfacer_han", "(${this::class.simpleName}) DownloadWorker's state: ${it.state.name}")
})
}
}
WorkManager.enqueueUniqueWork() ๋ฐ WorkManager.enqueueUniquePeriodicWork()๋ ํ ๋ฒ์ ํ๋๋ง ํ์ฑํํ ์ ์๋ ๊ณ ์ ํ ์ด๋ฆ์ WorkRequest๋ฅผ WorkManager์ ํ์ ๋ฃ์ ์ ์๋ค. ExistingWorkPolicy ๋ฐ ExistingPeriodicWorkPolicy์ ๋ํ ์ค๋ช ์ ์ ์ฝ๋์ ์ฃผ์์ ์ฐธ์กฐํ์.
#3 ์์ฝ
์ฌ๋ฌ ๊ฐ๊ฐ ์์ ํ์ ์๋ WorkRequest๋ฅผ ๊ด๋ฆฌํ๋ค.
#4 ์์ฑ๋ ์ฑ
android-practice/work-manager/EnqueueUniqueWork at master · Kanmanemone/android-practice
Contribute to Kanmanemone/android-practice development by creating an account on GitHub.
github.com
'๊นจ์ ๊ฐ๋ ๐ > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] WorkManager - ์ ์ฝ ์กฐ๊ฑด (Constraints) (0) | 2024.06.17 |
---|---|
[Android] WorkManager - ์ธ์ ์ ๋ฌ ๋ฐ ๋ฐ์ดํฐ ๋ฐํ (0) | 2024.06.17 |
[Android] WorkManager - ๊ธฐ์ด (0) | 2024.06.17 |
[Android] WorkManager - ๊ฐ์ (0) | 2024.06.14 |
[Android] Notifications - Action ๋ฒํผ ํด๋ฆญ ์ ์๋ฆผ Cancel (0) | 2024.06.14 |