#1 ์ด์ ๊ธ
[Android] WorkManager - ๊ฐ์
#1 WorkManager๋ '์ง์ฐ ๊ฐ๋ฅํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ '์ ๊ด๋ฆฌ์ WorkManager๋ฅผ ์ฌ์ฉํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ - Kotlin | Android DevelopersAndroid์๋ ๋ณด์ฅ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ํ ๋ค์์ ์ต์ ์ด ์์ผ๋ฉฐ, ์ด๋ฌํ ์ต์
kenel.tistory.com
๊ฐ๋ ์ค๋ช ์ ๊ทธ์ณค๋ ์ด์ ๊ธ์ ์ด์ด ๋ณธ ๊ฒ์๊ธ์์ ์ค์ ๋ก WorkManager๋ฅผ ๊ตฌํํด๋ณธ๋ค.
#2 WorkManager ์ฌ์ฉํ๊ธฐ
#2-1 ๋ชจ๋ ์์ค build.gradle ์์
plugins {
...
}
android {
...
}
dependencies {
...
// WorkManager
val work_version = "2.9.0"
implementation("androidx.work:work-runtime-ktx:$work_version") // Kotlin + coroutines
}
์ฌ๊ธฐ์ ์๋ ์ฝ๋๋ฅผ ๋ณต์ฌํ์ฌ ๋ชจ๋ ์์ค build.gradle์ dependencies { ... }์ ์ถ๊ฐํ๋ค.
#2-2 Worker ํด๋์ค ๋ง๋ค๊ธฐ - UploadWorker.kt
// package com.example.workmanagerbasics
import android.content.Context
import android.util.Log
import androidx.work.Worker
import androidx.work.WorkerParameters
import java.text.SimpleDateFormat
import java.util.Date
class UploadWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
try {
Log.i("interfacer_han", "(${this::class.simpleName}) Started at ${getNowTime()}")
for (i in 0..100) {
Log.i("interfacer_han", "(${this::class.simpleName}) Progress: ${i}/100")
}
Log.i("interfacer_han", "(${this::class.simpleName}) Finished at ${getNowTime()}")
return Result.success()
} catch (e: Exception) {
return Result.failure()
}
}
private fun getNowTime(): String {
val time = SimpleDateFormat("yyyy/MM/dd hh:mm:ss")
return time.format(Date())
}
}
Worker() ํด๋์ค๋ฅผ ์์๋ฐ๊ณ , ํ์์ ์ผ๋ก ์ค๋ฒ๋ผ์ด๋ํด์ผ ํ๋ ํจ์์ธ doWork()๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ๋ค. ์ด ํจ์ ์์๋ ์ค์ง์ ์ผ๋ก ์๋ฏธ๋ฅผ ๊ฐ๋ ์์ ๋ค ๊ฐ๋ น ์๋ฒ์ ํ์ผ์ Uploadํ๋ ์์ ์ด ์๋๋ผ, ๋๋ฏธ ์์ ๋ค์ ๋ฃ์๋ค. ๋, try { ... } catch { ... } ๋ฌธ์ผ๋ก ๋ถ๊ธฐ๋ฅผ ๋๋ ์์ ์ด ์คํจํ ๊ฒฝ์ฐ๋ returnํ ์ ์๊ฒ ํ๋ค.
#2-3 Worker ํด๋์ค ๋ง๋ค๊ธฐ - DownloadWorker.kt
#2-2์ ๋ด์ฉ์ด ์์ ํ ๋์ผํ์ง๋ง, ํ์ผ ๋ช ๋ฐ ํด๋์ค ์ด๋ฆ๋ง ๋ค๋ฅด๊ฒ ๋ง๋ ๋ค.
#2-4 activity_main.xml ์์
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/oneTimeButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="One Time Request"
android:textSize="40dp"
app:layout_constraintBottom_toTopOf="@+id/periodicButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/periodicButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Periodic Request"
android:textSize="40dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/oneTimeButton" />
</androidx.constraintlayout.widget.ConstraintLayout>
๋ฒํผ์ด 2๊ฐ ์๋ ๊ฐ๋จํ View๋ฅผ ๋ง๋ ๋ค. ์ด์ ๊ฒ์๊ธ์ฒ๋ผ, ์ฒซ๋ฒ์งธ ๋ฒํผ์ 1ํ์ฑ ์ํ (One Time)์ ์ํ ๋ฒํผ์ด๊ณ 2๋ฒ์งธ ๋ฒํผ์ ์ฃผ๊ธฐ์ ์ํ (Periodic)์ ์ํ ๋ฒํผ์ด๋ค.
#2-5 MainActivity.kt - onCreate()
// package com.example.workmanagerbasics
import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import androidx.work.WorkManager
lateinit var workManager: WorkManager
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
workManager = WorkManager.getInstance(applicationContext)
val oneTimeButton = findViewById<Button>(R.id.oneTimeButton)
val periodicButton = findViewById<Button>(R.id.periodicButton)
oneTimeButton.setOnClickListener {
setOneTimeWorkRequest()
}
periodicButton.setOnClickListener {
setPeriodicWorkRequest()
}
}
private fun setOneTimeWorkRequest() {
TODO()
}
private fun setPeriodicWorkRequest() {
TODO()
}
MainActivity์์ ์ฌ์ฉํ WorkManager ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ ์ธํ๊ณ onCreate()๋ฅผ ์์ฑํ๋ค. #2-4์์ ๋ง๋ค์๋ ์ฒซ๋ฒ์งธ ๋ฒํผ์ ํด๋ฆญํ๋ฉด setOneTimeWorkRequest(), 2๋ฒ์งธ ๋ฒํผ์ ํด๋ฆญํ๋ฉด setPeriodicWorkRequest()๊ฐ ์คํ๋๊ฒ ๋ง๋ ๋ค.
#2-6 MainActivity.kt - setOneTimeWorkRequest()
// package com.example.workmanagerbasics
...
import android.util.Log
import androidx.lifecycle.Observer
import androidx.work.OneTimeWorkRequest
lateinit var workManager: WorkManager
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
...
}
private fun setOneTimeWorkRequest() {
// WorkRequest ๊ฐ์ฒด ๋ง๋ค๊ธฐ
val uploadRequest = OneTimeWorkRequest
.Builder(UploadWorker::class.java)
.build()
// WorkManager ๊ฐ์ฒด์ ์์
ํ(Job queue)์ WorkRequest ๋ฑ๋ก
workManager.enqueue(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() {
TODO()
}
}
๋น๋ ํด๋์ค๋ก WorkRequest ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ์ด๋ฅผ WorkerManager์ ๋ฃ๋๋ค.
WorkManager.enqueue(request: WorkRequest)๋ก WorkRequest๋ฅผ WorkManager์ ์์ ํ์ ๋ฑ๋กํ๋ค. WorkInfo๋ ์งํ ์ค์ธ ์์ ์ ๋ํ ์ ๋ณด๋ฅผ LiveData์ ํํ๋ก ์ ๊ณตํ๋ค
๋ฐ๋ผ์, WorkInfo๋ฅผ LiveData.observe()ํ๋ ๊ฒ์ผ๋ก ์์ ์ ์งํ ์ํ(state)๋ฅผ ์ค์๊ฐ์ผ๋ก ํ์ธํ ์ ์๋ค (๋ณธ ๊ฒ์๊ธ์ #3 ์ฐธ์กฐ).
#2-7 MainActivity.kt - setPeriodicWorkRequest()
// package com.example.workmanagerbasics
...
import androidx.work.PeriodicWorkRequest
import java.util.concurrent.TimeUnit
lateinit var workManager: WorkManager
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
...
}
private fun setOneTimeWorkRequest() {
...
}
private fun setPeriodicWorkRequest() {
// WorkRequest ๊ฐ์ฒด ๋ง๋ค๊ธฐ
val downloadRequest = PeriodicWorkRequest
.Builder(DownloadWorker::class.java, 15, TimeUnit.MINUTES) // ์๋๋ก์ด๋์์ ํ์ฉํ๋ PeriodicWorkRequest์ ์ต์ ์ฃผ๊ธฐ๋ 15๋ถ์ด๋ค.
.build()
// WorkManager ๊ฐ์ฒด์ ์์
ํ(Job queue)์ WorkRequest ๋ฑ๋ก
workManager.enqueue(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}")
})
}
}
#2-6์ ์ ์ฒด์ ์ผ๋ก ๋น์ทํ๋ค. ์ธ๋ถ์ ์ผ๋ก๋ WorkManager ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋์ด๋ค ์ฐ๋ ํจ์๋ค์ ์ด๋ฆ์ด ์กฐ๊ธ์ฉ ๋ค๋ฅด๋ค๋ ์ฐจ์ด๊ฐ ์๋ค. ๊ทธ ์ค์์, WorkRequest์ ๋น๋ ํด๋์ค๊ฐ ์๊ตฌํ๋ ์ธ์๊ฐ 1๊ฐ๊ฐ ์๋๋ผ 3๊ฐ๋ผ๋ ์ ์ด ์ฃผ์ํ ์ฐจ์ด๋ค. PeriodicWorkRequest๋ ์ด๋ฆ์ฒ๋ผ ์ฃผ๊ธฐ(period)๋ฅผ ๊ฐ์ง๋๋ฐ, ์ด ์ฃผ๊ธฐ๋ง๋ค ์๋๋ก์ด๋ ์์คํ ์์ ํด๋น Worker๊ฐ ์คํ๋๋ค (์ฌ๊ธฐ์์๋ DownloadWorker). ์๋๋ก์ด๋์์ ํ์ฉํ๋ ์ต์ ์ฃผ๊ธฐ๋ 15๋ถ์ด๋ค.
#3 ์์ ์ ์ํ(State)
WorkInfo.State | Android Developers
androidx.compose.desktop.ui.tooling.preview
developer.android.com
WorkInfo.state์๋ BLOCKED, ENQUEUED, RUNNING, SUCCEEDED, FAIL, CACELLED์ 6๊ฐ์ง ์ํ๊ฐ ์๋ค.
BLOCKED๋ B์์ ์ ๋ํ WorkInfo์ ์ดํด๋ณด๋ ค๊ณ ํ ๋, B ์์ ์ ์ ํ ์์ A๊ฐ ์๋ฃ๋์ง ์์์ ์์ ์ A์๊ฒ ์ข ์๋(= ๋ค์ ์๋) B์ ์คํ์ด ์ ์๋(≠ ์คํจํ) ์ํ๋ค. (์ ํ ์์ ๋ฐ ํํ ์์ ์ ๋ํ ๊ฐ๋ ์ ์ด ๊ฒ์๊ธ ์ฐธ์กฐ)
ENQUEUED๋ ์ง์ ๋ ์กฐ๊ฑด(์ธํฐ๋ท ์ฐ๊ฒฐ์ด๋ ์ถฉ๋ถํ RAM ๋ฑ)์ ๊ธฐ๋ค๋ฆฌ๋๋ผ ์์ ์ด ์์ง ์์๋์ง ์๊ณ ์คํ ๋๊ธฐ์ด์๋ง ์กด์ฌํ๋ ์ํ๋ค.
RUNNING์ ๋ง ๊ทธ๋๋ก ์์ ์ด ์งํ์ค์ธ ์ํ๋ค.
SUCCEEDED๋ ์์
์ด ์ฑ๊ณตํ ์ํ๋ค
FAILED๋ ์์
์ด ์คํจํ ์ํ๋ค. BLOCKED๊ณผ ๊ฐ์ ๋งฅ๋ฝ์ผ๋ก, ์์ ์์ผ๋ก ์ข
์๋ ํํ ์์
๋ค๋ ์ ๋ถ FAILED๋ก ๋ณ๊ฒฝ๋๋ค. BLOCKED์๋ ๋ฐ๋๋ก ํํ ์์
๋ค์ด ์คํจ ์ฒ๋ฆฌ๋(≠ ์ ์๋) ์ํ๋ผ๋ ๊ฒ์ ์ ์ํ์. (์ ํ ์์
๋ฐ ํํ ์์
์ ๋ํ ๊ฐ๋
์ ์ด ๊ฒ์๊ธ ์ฐธ์กฐ)
CANCELLED๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ช ์์ ์ผ๋ก ์์ ์ ์ทจ์ํ๊ฑฐ๋ ์์คํ ์ ์ํด ์ทจ์๋ ๊ฒฝ์ฐ๋ค.
PeriodicWorkRequest๋ BLOCKED, SUCCEEDED, FAILED ์ํ๋ฅผ ๊ฐ์ง ์ ์๋ค. #4-3์ ์ฐธ๊ณ ํ์.
#4 ์๋ ํ์ธ
#4-1 View์ ๋ชจ์ต
#4-2 'One Time Request' ๋ฒํผ์ ํด๋ฆญํ์ ๋์ ๋ก๊ทธ ๋ฉ์์ง
(MainActivity) UploadWorker's state: ENQUEUED
(MainActivity) UploadWorker's state: RUNNING
(UploadWorker) Started at 2024/06/17 12:42:04
(UploadWorker) Progress: 0/100
(UploadWorker) Progress: 1/100
(UploadWorker) Progress: 2/100
(UploadWorker) Progress: 3/100
(UploadWorker) Progress: 4/100
(UploadWorker) Progress: 5/100
(UploadWorker) Progress: 6/100
(UploadWorker) Progress: 7/100
(UploadWorker) Progress: 8/100
(UploadWorker) Progress: 9/100
(UploadWorker) Progress: 10/100
(UploadWorker) Progress: 11/100
(UploadWorker) Progress: 12/100
(UploadWorker) Progress: 13/100
(UploadWorker) Progress: 14/100
(UploadWorker) Progress: 15/100
(UploadWorker) Progress: 16/100
(UploadWorker) Progress: 17/100
(UploadWorker) Progress: 18/100
(UploadWorker) Progress: 19/100
(UploadWorker) Progress: 20/100
(UploadWorker) Progress: 21/100
(UploadWorker) Progress: 22/100
(UploadWorker) Progress: 23/100
(UploadWorker) Progress: 24/100
(UploadWorker) Progress: 25/100
(UploadWorker) Progress: 26/100
(UploadWorker) Progress: 27/100
(UploadWorker) Progress: 28/100
(UploadWorker) Progress: 29/100
(UploadWorker) Progress: 30/100
(UploadWorker) Progress: 31/100
(UploadWorker) Progress: 32/100
(UploadWorker) Progress: 33/100
(UploadWorker) Progress: 34/100
(UploadWorker) Progress: 35/100
(UploadWorker) Progress: 36/100
(UploadWorker) Progress: 37/100
(UploadWorker) Progress: 38/100
(UploadWorker) Progress: 39/100
(UploadWorker) Progress: 40/100
(UploadWorker) Progress: 41/100
(UploadWorker) Progress: 42/100
(UploadWorker) Progress: 43/100
(UploadWorker) Progress: 44/100
(UploadWorker) Progress: 45/100
(UploadWorker) Progress: 46/100
(UploadWorker) Progress: 47/100
(UploadWorker) Progress: 48/100
(UploadWorker) Progress: 49/100
(UploadWorker) Progress: 50/100
(UploadWorker) Progress: 51/100
(UploadWorker) Progress: 52/100
(UploadWorker) Progress: 53/100
(UploadWorker) Progress: 54/100
(UploadWorker) Progress: 55/100
(UploadWorker) Progress: 56/100
(UploadWorker) Progress: 57/100
(UploadWorker) Progress: 58/100
(UploadWorker) Progress: 59/100
(UploadWorker) Progress: 60/100
(UploadWorker) Progress: 61/100
(UploadWorker) Progress: 62/100
(UploadWorker) Progress: 63/100
(UploadWorker) Progress: 64/100
(UploadWorker) Progress: 65/100
(UploadWorker) Progress: 66/100
(UploadWorker) Progress: 67/100
(UploadWorker) Progress: 68/100
(UploadWorker) Progress: 69/100
(UploadWorker) Progress: 70/100
(UploadWorker) Progress: 71/100
(UploadWorker) Progress: 72/100
(UploadWorker) Progress: 73/100
(UploadWorker) Progress: 74/100
(UploadWorker) Progress: 75/100
(UploadWorker) Progress: 76/100
(UploadWorker) Progress: 77/100
(UploadWorker) Progress: 78/100
(UploadWorker) Progress: 79/100
(UploadWorker) Progress: 80/100
(UploadWorker) Progress: 81/100
(UploadWorker) Progress: 82/100
(UploadWorker) Progress: 83/100
(UploadWorker) Progress: 84/100
(UploadWorker) Progress: 85/100
(UploadWorker) Progress: 86/100
(UploadWorker) Progress: 87/100
(UploadWorker) Progress: 88/100
(UploadWorker) Progress: 89/100
(UploadWorker) Progress: 90/100
(UploadWorker) Progress: 91/100
(UploadWorker) Progress: 92/100
(UploadWorker) Progress: 93/100
(UploadWorker) Progress: 94/100
(UploadWorker) Progress: 95/100
(UploadWorker) Progress: 96/100
(UploadWorker) Progress: 97/100
(UploadWorker) Progress: 98/100
(UploadWorker) Progress: 99/100
(UploadWorker) Progress: 100/100
(UploadWorker) Finished at 2024/06/17 12:42:04
(MainActivity) UploadWorker's state: SUCCEEDED
#4-3 'Periodic Request' ๋ฒํผ์ ํด๋ฆญํ์ ๋์ ๋ก๊ทธ ๋ฉ์์ง
(MainActivity) DownloadWorker's state: ENQUEUED
(MainActivity) DownloadWorker's state: RUNNING
(DownloadWorker) Started at 2024/06/17 12:52:41
(DownloadWorker) Progress: 0/100
(DownloadWorker) Progress: 1/100
(DownloadWorker) Progress: 2/100
(DownloadWorker) Progress: 3/100
(DownloadWorker) Progress: 4/100
(DownloadWorker) Progress: 5/100
(DownloadWorker) Progress: 6/100
(DownloadWorker) Progress: 7/100
(DownloadWorker) Progress: 8/100
(DownloadWorker) Progress: 9/100
(DownloadWorker) Progress: 10/100
(DownloadWorker) Progress: 11/100
(DownloadWorker) Progress: 12/100
(DownloadWorker) Progress: 13/100
(DownloadWorker) Progress: 14/100
(DownloadWorker) Progress: 15/100
(DownloadWorker) Progress: 16/100
(DownloadWorker) Progress: 17/100
(DownloadWorker) Progress: 18/100
(DownloadWorker) Progress: 19/100
(DownloadWorker) Progress: 20/100
(DownloadWorker) Progress: 21/100
(DownloadWorker) Progress: 22/100
(DownloadWorker) Progress: 23/100
(DownloadWorker) Progress: 24/100
(DownloadWorker) Progress: 25/100
(DownloadWorker) Progress: 26/100
(DownloadWorker) Progress: 27/100
(DownloadWorker) Progress: 28/100
(DownloadWorker) Progress: 29/100
(DownloadWorker) Progress: 30/100
(DownloadWorker) Progress: 31/100
(DownloadWorker) Progress: 32/100
(DownloadWorker) Progress: 33/100
(DownloadWorker) Progress: 34/100
(DownloadWorker) Progress: 35/100
(DownloadWorker) Progress: 36/100
(DownloadWorker) Progress: 37/100
(DownloadWorker) Progress: 38/100
(DownloadWorker) Progress: 39/100
(DownloadWorker) Progress: 40/100
(DownloadWorker) Progress: 41/100
(DownloadWorker) Progress: 42/100
(DownloadWorker) Progress: 43/100
(DownloadWorker) Progress: 44/100
(DownloadWorker) Progress: 45/100
(DownloadWorker) Progress: 46/100
(DownloadWorker) Progress: 47/100
(DownloadWorker) Progress: 48/100
(DownloadWorker) Progress: 49/100
(DownloadWorker) Progress: 50/100
(DownloadWorker) Progress: 51/100
(DownloadWorker) Progress: 52/100
(DownloadWorker) Progress: 53/100
(DownloadWorker) Progress: 54/100
(DownloadWorker) Progress: 55/100
(DownloadWorker) Progress: 56/100
(DownloadWorker) Progress: 57/100
(DownloadWorker) Progress: 58/100
(DownloadWorker) Progress: 59/100
(DownloadWorker) Progress: 60/100
(DownloadWorker) Progress: 61/100
(DownloadWorker) Progress: 62/100
(DownloadWorker) Progress: 63/100
(DownloadWorker) Progress: 64/100
(DownloadWorker) Progress: 65/100
(DownloadWorker) Progress: 66/100
(DownloadWorker) Progress: 67/100
(DownloadWorker) Progress: 68/100
(DownloadWorker) Progress: 69/100
(DownloadWorker) Progress: 70/100
(DownloadWorker) Progress: 71/100
(DownloadWorker) Progress: 72/100
(DownloadWorker) Progress: 73/100
(DownloadWorker) Progress: 74/100
(DownloadWorker) Progress: 75/100
(DownloadWorker) Progress: 76/100
(DownloadWorker) Progress: 77/100
(DownloadWorker) Progress: 78/100
(DownloadWorker) Progress: 79/100
(DownloadWorker) Progress: 80/100
(DownloadWorker) Progress: 81/100
(DownloadWorker) Progress: 82/100
(DownloadWorker) Progress: 83/100
(DownloadWorker) Progress: 84/100
(DownloadWorker) Progress: 85/100
(DownloadWorker) Progress: 86/100
(DownloadWorker) Progress: 87/100
(DownloadWorker) Progress: 88/100
(DownloadWorker) Progress: 89/100
(DownloadWorker) Progress: 90/100
(DownloadWorker) Progress: 91/100
(DownloadWorker) Progress: 92/100
(DownloadWorker) Progress: 93/100
(DownloadWorker) Progress: 94/100
(DownloadWorker) Progress: 95/100
(DownloadWorker) Progress: 96/100
(DownloadWorker) Progress: 97/100
(DownloadWorker) Progress: 98/100
(DownloadWorker) Progress: 99/100
(DownloadWorker) Progress: 100/100
(DownloadWorker) Finished at 2024/06/17 12:52:41
(MainActivity) DownloadWorker's state: ENQUEUED
(DownloadWorker) Started at 2024/06/17 01:07:41
(DownloadWorker) Progress: 0/100
(DownloadWorker) Progress: 1/100
(DownloadWorker) Progress: 2/100
(DownloadWorker) Progress: 3/100
(DownloadWorker) Progress: 4/100
(DownloadWorker) Progress: 5/100
(DownloadWorker) Progress: 6/100
(DownloadWorker) Progress: 7/100
(DownloadWorker) Progress: 8/100
(DownloadWorker) Progress: 9/100
(DownloadWorker) Progress: 10/100
(DownloadWorker) Progress: 11/100
(DownloadWorker) Progress: 12/100
(DownloadWorker) Progress: 13/100
(DownloadWorker) Progress: 14/100
(DownloadWorker) Progress: 15/100
(DownloadWorker) Progress: 16/100
(DownloadWorker) Progress: 17/100
(DownloadWorker) Progress: 18/100
(DownloadWorker) Progress: 19/100
(DownloadWorker) Progress: 20/100
(MainActivity) DownloadWorker's state: RUNNING
(DownloadWorker) Progress: 21/100
(DownloadWorker) Progress: 22/100
(DownloadWorker) Progress: 23/100
(DownloadWorker) Progress: 24/100
(DownloadWorker) Progress: 25/100
(DownloadWorker) Progress: 26/100
(DownloadWorker) Progress: 27/100
(DownloadWorker) Progress: 28/100
(DownloadWorker) Progress: 29/100
(DownloadWorker) Progress: 30/100
(DownloadWorker) Progress: 31/100
(DownloadWorker) Progress: 32/100
(DownloadWorker) Progress: 33/100
(DownloadWorker) Progress: 34/100
(DownloadWorker) Progress: 35/100
(DownloadWorker) Progress: 36/100
(DownloadWorker) Progress: 37/100
(DownloadWorker) Progress: 38/100
(DownloadWorker) Progress: 39/100
(DownloadWorker) Progress: 40/100
(DownloadWorker) Progress: 41/100
(DownloadWorker) Progress: 42/100
(DownloadWorker) Progress: 43/100
(DownloadWorker) Progress: 44/100
(DownloadWorker) Progress: 45/100
(DownloadWorker) Progress: 46/100
(DownloadWorker) Progress: 47/100
(DownloadWorker) Progress: 48/100
(DownloadWorker) Progress: 49/100
(DownloadWorker) Progress: 50/100
(DownloadWorker) Progress: 51/100
(DownloadWorker) Progress: 52/100
(DownloadWorker) Progress: 53/100
(DownloadWorker) Progress: 54/100
(DownloadWorker) Progress: 55/100
(DownloadWorker) Progress: 56/100
(DownloadWorker) Progress: 57/100
(DownloadWorker) Progress: 58/100
(DownloadWorker) Progress: 59/100
(DownloadWorker) Progress: 60/100
(DownloadWorker) Progress: 61/100
(DownloadWorker) Progress: 62/100
(DownloadWorker) Progress: 63/100
(DownloadWorker) Progress: 64/100
(DownloadWorker) Progress: 65/100
(DownloadWorker) Progress: 66/100
(DownloadWorker) Progress: 67/100
(DownloadWorker) Progress: 68/100
(DownloadWorker) Progress: 69/100
(DownloadWorker) Progress: 70/100
(DownloadWorker) Progress: 71/100
(DownloadWorker) Progress: 72/100
(DownloadWorker) Progress: 73/100
(DownloadWorker) Progress: 74/100
(DownloadWorker) Progress: 75/100
(DownloadWorker) Progress: 76/100
(DownloadWorker) Progress: 77/100
(DownloadWorker) Progress: 78/100
(DownloadWorker) Progress: 79/100
(DownloadWorker) Progress: 80/100
(DownloadWorker) Progress: 81/100
(DownloadWorker) Progress: 82/100
(DownloadWorker) Progress: 83/100
(DownloadWorker) Progress: 84/100
(DownloadWorker) Progress: 85/100
(DownloadWorker) Progress: 86/100
(DownloadWorker) Progress: 87/100
(DownloadWorker) Progress: 88/100
(DownloadWorker) Progress: 89/100
(DownloadWorker) Progress: 90/100
(DownloadWorker) Progress: 91/100
(DownloadWorker) Progress: 92/100
(DownloadWorker) Progress: 93/100
(DownloadWorker) Progress: 94/100
(DownloadWorker) Progress: 95/100
(DownloadWorker) Progress: 96/100
(DownloadWorker) Progress: 97/100
(DownloadWorker) Progress: 98/100
(DownloadWorker) Progress: 99/100
(DownloadWorker) Progress: 100/100
(DownloadWorker) Finished at 2024/06/17 01:07:41
(MainActivity) DownloadWorker's state: ENQUEUED
(DownloadWorker) Started at 2024/06/17 01:22:41
(DownloadWorker) Progress: 0/100
(DownloadWorker) Progress: 1/100
(DownloadWorker) Progress: 2/100
(DownloadWorker) Progress: 3/100
(DownloadWorker) Progress: 4/100
(DownloadWorker) Progress: 5/100
(DownloadWorker) Progress: 6/100
(DownloadWorker) Progress: 7/100
(DownloadWorker) Progress: 8/100
(DownloadWorker) Progress: 9/100
(DownloadWorker) Progress: 10/100
(DownloadWorker) Progress: 11/100
(DownloadWorker) Progress: 12/100
(DownloadWorker) Progress: 13/100
(DownloadWorker) Progress: 14/100
(DownloadWorker) Progress: 15/100
(DownloadWorker) Progress: 16/100
(DownloadWorker) Progress: 17/100
(DownloadWorker) Progress: 18/100
(DownloadWorker) Progress: 19/100
(DownloadWorker) Progress: 20/100
(DownloadWorker) Progress: 21/100
(DownloadWorker) Progress: 22/100
(DownloadWorker) Progress: 23/100
(DownloadWorker) Progress: 24/100
(DownloadWorker) Progress: 25/100
(DownloadWorker) Progress: 26/100
(DownloadWorker) Progress: 27/100
(DownloadWorker) Progress: 28/100
(DownloadWorker) Progress: 29/100
(DownloadWorker) Progress: 30/100
(DownloadWorker) Progress: 31/100
(DownloadWorker) Progress: 32/100
(DownloadWorker) Progress: 33/100
(DownloadWorker) Progress: 34/100
(DownloadWorker) Progress: 35/100
(DownloadWorker) Progress: 36/100
(DownloadWorker) Progress: 37/100
(DownloadWorker) Progress: 38/100
(DownloadWorker) Progress: 39/100
(DownloadWorker) Progress: 40/100
(MainActivity) DownloadWorker's state: RUNNING
(DownloadWorker) Progress: 41/100
(DownloadWorker) Progress: 42/100
(DownloadWorker) Progress: 43/100
(DownloadWorker) Progress: 44/100
(DownloadWorker) Progress: 45/100
(DownloadWorker) Progress: 46/100
(DownloadWorker) Progress: 47/100
(DownloadWorker) Progress: 48/100
(DownloadWorker) Progress: 49/100
(DownloadWorker) Progress: 50/100
(DownloadWorker) Progress: 51/100
(DownloadWorker) Progress: 52/100
(DownloadWorker) Progress: 53/100
(DownloadWorker) Progress: 54/100
(DownloadWorker) Progress: 55/100
(DownloadWorker) Progress: 56/100
(DownloadWorker) Progress: 57/100
(DownloadWorker) Progress: 58/100
(DownloadWorker) Progress: 59/100
(DownloadWorker) Progress: 60/100
(DownloadWorker) Progress: 61/100
(DownloadWorker) Progress: 62/100
(DownloadWorker) Progress: 63/100
(DownloadWorker) Progress: 64/100
(DownloadWorker) Progress: 65/100
(DownloadWorker) Progress: 66/100
(DownloadWorker) Progress: 67/100
(DownloadWorker) Progress: 68/100
(DownloadWorker) Progress: 69/100
(DownloadWorker) Progress: 70/100
(DownloadWorker) Progress: 71/100
(DownloadWorker) Progress: 72/100
(DownloadWorker) Progress: 73/100
(DownloadWorker) Progress: 74/100
(DownloadWorker) Progress: 75/100
(DownloadWorker) Progress: 76/100
(DownloadWorker) Progress: 77/100
(DownloadWorker) Progress: 78/100
(DownloadWorker) Progress: 79/100
(DownloadWorker) Progress: 80/100
(DownloadWorker) Progress: 81/100
(DownloadWorker) Progress: 82/100
(DownloadWorker) Progress: 83/100
(DownloadWorker) Progress: 84/100
(DownloadWorker) Progress: 85/100
(DownloadWorker) Progress: 86/100
(DownloadWorker) Progress: 87/100
(DownloadWorker) Progress: 88/100
(DownloadWorker) Progress: 89/100
(DownloadWorker) Progress: 90/100
(DownloadWorker) Progress: 91/100
(DownloadWorker) Progress: 92/100
(DownloadWorker) Progress: 93/100
(DownloadWorker) Progress: 94/100
(DownloadWorker) Progress: 95/100
(DownloadWorker) Progress: 96/100
(DownloadWorker) Progress: 97/100
(DownloadWorker) Progress: 98/100
(DownloadWorker) Progress: 99/100
(DownloadWorker) Progress: 100/100
(DownloadWorker) Finished at 2024/06/17 01:22:41
(MainActivity) DownloadWorker's state: ENQUEUED
(DownloadWorker) Started at 2024/06/17 01:37:41
(DownloadWorker) Progress: 0/100
(DownloadWorker) Progress: 1/100
(DownloadWorker) Progress: 2/100
(DownloadWorker) Progress: 3/100
(DownloadWorker) Progress: 4/100
(DownloadWorker) Progress: 5/100
(DownloadWorker) Progress: 6/100
(DownloadWorker) Progress: 7/100
(DownloadWorker) Progress: 8/100
(DownloadWorker) Progress: 9/100
(DownloadWorker) Progress: 10/100
(DownloadWorker) Progress: 11/100
(DownloadWorker) Progress: 12/100
(DownloadWorker) Progress: 13/100
(DownloadWorker) Progress: 14/100
(DownloadWorker) Progress: 15/100
(DownloadWorker) Progress: 16/100
(DownloadWorker) Progress: 17/100
(DownloadWorker) Progress: 18/100
(MainActivity) DownloadWorker's state: RUNNING
(DownloadWorker) Progress: 19/100
(DownloadWorker) Progress: 20/100
(DownloadWorker) Progress: 21/100
(DownloadWorker) Progress: 22/100
(DownloadWorker) Progress: 23/100
(DownloadWorker) Progress: 24/100
(DownloadWorker) Progress: 25/100
(DownloadWorker) Progress: 26/100
(DownloadWorker) Progress: 27/100
(DownloadWorker) Progress: 28/100
(DownloadWorker) Progress: 29/100
(DownloadWorker) Progress: 30/100
(DownloadWorker) Progress: 31/100
(DownloadWorker) Progress: 32/100
(DownloadWorker) Progress: 33/100
(DownloadWorker) Progress: 34/100
(DownloadWorker) Progress: 35/100
(DownloadWorker) Progress: 36/100
(DownloadWorker) Progress: 37/100
(DownloadWorker) Progress: 38/100
(DownloadWorker) Progress: 39/100
(DownloadWorker) Progress: 40/100
(DownloadWorker) Progress: 41/100
(DownloadWorker) Progress: 42/100
(DownloadWorker) Progress: 43/100
(DownloadWorker) Progress: 44/100
(DownloadWorker) Progress: 45/100
(DownloadWorker) Progress: 46/100
(DownloadWorker) Progress: 47/100
(DownloadWorker) Progress: 48/100
(DownloadWorker) Progress: 49/100
(DownloadWorker) Progress: 50/100
(DownloadWorker) Progress: 51/100
(DownloadWorker) Progress: 52/100
(DownloadWorker) Progress: 53/100
(DownloadWorker) Progress: 54/100
(DownloadWorker) Progress: 55/100
(DownloadWorker) Progress: 56/100
(DownloadWorker) Progress: 57/100
(DownloadWorker) Progress: 58/100
(DownloadWorker) Progress: 59/100
(DownloadWorker) Progress: 60/100
(DownloadWorker) Progress: 61/100
(DownloadWorker) Progress: 62/100
(DownloadWorker) Progress: 63/100
(DownloadWorker) Progress: 64/100
(DownloadWorker) Progress: 65/100
(DownloadWorker) Progress: 66/100
(DownloadWorker) Progress: 67/100
(DownloadWorker) Progress: 68/100
(DownloadWorker) Progress: 69/100
(DownloadWorker) Progress: 70/100
(DownloadWorker) Progress: 71/100
(DownloadWorker) Progress: 72/100
(DownloadWorker) Progress: 73/100
(DownloadWorker) Progress: 74/100
(DownloadWorker) Progress: 75/100
(DownloadWorker) Progress: 76/100
(DownloadWorker) Progress: 77/100
(DownloadWorker) Progress: 78/100
(DownloadWorker) Progress: 79/100
(DownloadWorker) Progress: 80/100
(DownloadWorker) Progress: 81/100
(DownloadWorker) Progress: 82/100
(DownloadWorker) Progress: 83/100
(DownloadWorker) Progress: 84/100
(DownloadWorker) Progress: 85/100
(DownloadWorker) Progress: 86/100
(DownloadWorker) Progress: 87/100
(DownloadWorker) Progress: 88/100
(DownloadWorker) Progress: 89/100
(DownloadWorker) Progress: 90/100
(DownloadWorker) Progress: 91/100
(DownloadWorker) Progress: 92/100
(DownloadWorker) Progress: 93/100
(DownloadWorker) Progress: 94/100
(DownloadWorker) Progress: 95/100
(DownloadWorker) Progress: 96/100
(DownloadWorker) Progress: 97/100
(DownloadWorker) Progress: 98/100
(DownloadWorker) Progress: 99/100
(DownloadWorker) Progress: 100/100
(DownloadWorker) Finished at 2024/06/17 01:37:41
(MainActivity) DownloadWorker's state: ENQUEUED
(DownloadWorker) Started at 2024/06/17 01:52:41
(DownloadWorker) Progress: 0/100
(DownloadWorker) Progress: 1/100
(DownloadWorker) Progress: 2/100
(DownloadWorker) Progress: 3/100
(DownloadWorker) Progress: 4/100
(DownloadWorker) Progress: 5/100
(DownloadWorker) Progress: 6/100
(DownloadWorker) Progress: 7/100
(DownloadWorker) Progress: 8/100
(DownloadWorker) Progress: 9/100
(DownloadWorker) Progress: 10/100
(DownloadWorker) Progress: 11/100
(DownloadWorker) Progress: 12/100
(DownloadWorker) Progress: 13/100
(DownloadWorker) Progress: 14/100
(DownloadWorker) Progress: 15/100
(DownloadWorker) Progress: 16/100
(DownloadWorker) Progress: 17/100
(DownloadWorker) Progress: 18/100
(DownloadWorker) Progress: 19/100
(DownloadWorker) Progress: 20/100
(DownloadWorker) Progress: 21/100
(DownloadWorker) Progress: 22/100
(DownloadWorker) Progress: 23/100
(DownloadWorker) Progress: 24/100
(DownloadWorker) Progress: 25/100
(DownloadWorker) Progress: 26/100
(DownloadWorker) Progress: 27/100
(DownloadWorker) Progress: 28/100
(DownloadWorker) Progress: 29/100
(DownloadWorker) Progress: 30/100
(DownloadWorker) Progress: 31/100
(DownloadWorker) Progress: 32/100
(DownloadWorker) Progress: 33/100
(DownloadWorker) Progress: 34/100
(DownloadWorker) Progress: 35/100
(MainActivity) DownloadWorker's state: RUNNING
(DownloadWorker) Progress: 36/100
(DownloadWorker) Progress: 37/100
(DownloadWorker) Progress: 38/100
(DownloadWorker) Progress: 39/100
(DownloadWorker) Progress: 40/100
(DownloadWorker) Progress: 41/100
(DownloadWorker) Progress: 42/100
(DownloadWorker) Progress: 43/100
(DownloadWorker) Progress: 44/100
(DownloadWorker) Progress: 45/100
(DownloadWorker) Progress: 46/100
(DownloadWorker) Progress: 47/100
(DownloadWorker) Progress: 48/100
(DownloadWorker) Progress: 49/100
(DownloadWorker) Progress: 50/100
(DownloadWorker) Progress: 51/100
(DownloadWorker) Progress: 52/100
(DownloadWorker) Progress: 53/100
(DownloadWorker) Progress: 54/100
(DownloadWorker) Progress: 55/100
(DownloadWorker) Progress: 56/100
(DownloadWorker) Progress: 57/100
(DownloadWorker) Progress: 58/100
(DownloadWorker) Progress: 59/100
(DownloadWorker) Progress: 60/100
(DownloadWorker) Progress: 61/100
(DownloadWorker) Progress: 62/100
(DownloadWorker) Progress: 63/100
(DownloadWorker) Progress: 64/100
(DownloadWorker) Progress: 65/100
(DownloadWorker) Progress: 66/100
(DownloadWorker) Progress: 67/100
(DownloadWorker) Progress: 68/100
(DownloadWorker) Progress: 69/100
(DownloadWorker) Progress: 70/100
(DownloadWorker) Progress: 71/100
(DownloadWorker) Progress: 72/100
(DownloadWorker) Progress: 73/100
(DownloadWorker) Progress: 74/100
(DownloadWorker) Progress: 75/100
(DownloadWorker) Progress: 76/100
(DownloadWorker) Progress: 77/100
(DownloadWorker) Progress: 78/100
(DownloadWorker) Progress: 79/100
(DownloadWorker) Progress: 80/100
(DownloadWorker) Progress: 81/100
(DownloadWorker) Progress: 82/100
(DownloadWorker) Progress: 83/100
(DownloadWorker) Progress: 84/100
(DownloadWorker) Progress: 85/100
(DownloadWorker) Progress: 86/100
(DownloadWorker) Progress: 87/100
(DownloadWorker) Progress: 88/100
(DownloadWorker) Progress: 89/100
(DownloadWorker) Progress: 90/100
(DownloadWorker) Progress: 91/100
(DownloadWorker) Progress: 92/100
(DownloadWorker) Progress: 93/100
(DownloadWorker) Progress: 94/100
(DownloadWorker) Progress: 95/100
(DownloadWorker) Progress: 96/100
(DownloadWorker) Progress: 97/100
(DownloadWorker) Progress: 98/100
(DownloadWorker) Progress: 99/100
(DownloadWorker) Progress: 100/100
(DownloadWorker) Finished at 2024/06/17 01:52:41
(MainActivity) DownloadWorker's state: ENQUEUED
์ดํ ์๋ต
1์๊ฐ ์ ๋๋ฅผ ๊ธฐ๋ค๋ ค, ์ด 4๋ฒ์ ์์ ์ํ์ ๋ํ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ์ป์ด๋๋ค. ํ์ง๋ง, ๋ก๊ทธ ๋ฉ์์ง์์ ๋ณด๋ฏ PeriodicWorkRequest๋ SUCCEEDED ์ํ ๋ฐ FAILED ์ํ๋ฅผ ๊ฐ์ง ์ ์๋ค. PeriodicWorkRequest๋ ๋ช ์์ ์ผ๋ก ์ทจ์ํ๊ธฐ ์ ๊น์ง ๋ฌดํํ๊ณ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํ๋๋ ์์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ด PeriodicWorkRequest๊ฐ OneTimeWorkRequest์๋ค๋ฉด SUCCEEDED ๋ฐ FAILED ์ํ์๊ฒ ์ง๋ง ๊ทธ ๋์ , ENQUEUED ์ํ๋ก ๋์๊ฐ ๋ค์ RUNNING๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค.
๋, PeriodicWorkRequest๋ Chaining์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ BLOCKED ์ํ ๋ํ ์ง๋ ์ ์๋ค. Chaining์ ๊ดํ ๋ด์ฉ์ ์ด ๊ฒ์๊ธ๋ฅผ ๋ด์ผ ์ดํดํ ์ ์๋ค.
#5 ์์ฝ
WorkManager๋ก ์ฌ๋ฌ ์์ ๋ค์ ์๋๋ก์ด๋ ์์คํ ์ ๋งก๊ฒจ๋๋๋ค.
#6 ์์ฑ๋ ์ฑ
android-practice/work-manager/WorkManagerBasics at master · Kanmanemone/android-practice
Contribute to Kanmanemone/android-practice development by creating an account on GitHub.
github.com
#7 ์ด์ด์ง๋ ๊ธ
#7-1 WorkRequest์ ์ด๋ฆ ๋ถ์ด๊ณ ๊ด๋ฆฌํ๊ธฐ
[Android] WorkManager - enqueueUniqueWork()
#1 ์ด์ ๊ธ [Android] WorkManager - ๊ธฐ์ด#1 ์ด์ ๊ธ [Android] WorkManager - ๊ฐ์#1 WorkManager๋ '์ง์ฐ ๊ฐ๋ฅํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ '์ ๊ด๋ฆฌ์ WorkManager๋ฅผ ์ฌ์ฉํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ - Kotlin | Android DevelopersAndroid์๋
kenel.tistory.com
#7-2 Worker์ ์ธ์ ์ ๋ฌ ๋ฐ ๋ฐ์ดํฐ ๋ฐํ๋ฐ๊ธฐ
[Android] WorkManager - ์ธ์ ์ ๋ฌ ๋ฐ ๋ฐ์ดํฐ ๋ฐํ
#1 ์ด์ ๊ธ [Android] WorkManager - ๊ธฐ์ด#1 ์ด์ ๊ธ [Android] WorkManager - ๊ฐ์#1 WorkManager๋ '์ง์ฐ ๊ฐ๋ฅํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ '์ ๊ด๋ฆฌ์ WorkManager๋ฅผ ์ฌ์ฉํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ - Kotlin | Android DevelopersAndroid์๋
kenel.tistory.com
#7-3 WorkRequest ์คํ์ ํ์ํ ์กฐ๊ฑด ๊ฑธ๊ธฐ
[Android] WorkManager - ์ ์ฝ ์กฐ๊ฑด (Constraints)
#1 ์ด์ ๊ธ [Android] WorkManager - ๊ธฐ์ด#1 ์ด์ ๊ธ [Android] WorkManager - ๊ฐ์#1 WorkManager๋ '์ง์ฐ ๊ฐ๋ฅํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ '์ ๊ด๋ฆฌ์ WorkManager๋ฅผ ์ฌ์ฉํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ - Kotlin | Android DevelopersAndroid์๋
kenel.tistory.com
#7-4 ์์ ์ฐ์ํ๊ธฐ(Chaining)
[Android] WorkManager - ์์ ์ฐ์ํ๊ธฐ(Chaining)
#1 ์ด์ ๊ธ [Android] WorkManager - ๊ธฐ์ด#1 ์ด์ ๊ธ [Android] WorkManager - ๊ฐ์#1 WorkManager๋ '์ง์ฐ ๊ฐ๋ฅํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ '์ ๊ด๋ฆฌ์ WorkManager๋ฅผ ์ฌ์ฉํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ - Kotlin | Android DevelopersAndroid์๋
kenel.tistory.com
'๊นจ์ ๊ฐ๋ ๐ > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] WorkManager - ์ธ์ ์ ๋ฌ ๋ฐ ๋ฐ์ดํฐ ๋ฐํ (0) | 2024.06.17 |
---|---|
[Android] WorkManager - enqueueUniqueWork() (0) | 2024.06.17 |
[Android] WorkManager - ๊ฐ์ (0) | 2024.06.14 |
[Android] Notifications - Action ๋ฒํผ ํด๋ฆญ ์ ์๋ฆผ Cancel (0) | 2024.06.14 |
[Android] Notifications - PendingIntent (0) | 2024.06.12 |