WorkManager — ay isang Jetpack library ng Android na idinisenyo para sa pagsasagawa ng mga naantalang at background na gawain na may garantiya ng pagpapatupad. Hindi tulad ng Service o JobScheduler, inaako ng WorkManager ang pamamahala ng lifecycle ng gawain: ito ay nag-restart kapag may pagkabigo, umaangkop sa bersyon ng Android, at isinasaalang-alang ang mga limitasyon ng device. Ayon sa Android Developers, 2026, ang WorkManager ay ang pinipiling solusyon para sa karamihan ng mga background na operasyon sa modernong pag-develop ng Android.
Mga Pangunahing Punto
WorkManager — ay bahagi ng Android Jetpack, isang library para sa pamamahala ng mga background na gawain na dapat garantisadong maisakatuparan, kahit na ang app ay nasa foreground o isinara ng user. Ang library ay sumusuporta sa API 14+ at awtomatikong pumipili ng angkop na mekanismo ng pagpapatupad: JobScheduler sa Android 5+, BroadcastReceiver + AlarmManager sa mas lumang mga bersyon.
Ang pangunahing tampok ng WorkManager ay ang garantiya ng pagpapatupad. Kung ang isang gawain ay hindi natapos dahil sa pag-restart ng device, paghinto ng app, o pagkabigo, ire-restart ito ng WorkManager sa unang pagkakataon. Ginagawa nitong perpektong pagpipilian ang library para sa mga gawaing kritikal sa pagpapatupad: pagpapadala ng analytics, pag-sync ng database, pag-upload ng mga log.
Hindi tulad ng Background Service, hindi nangangailangan ang WorkManager ng pamamahala ng thread at lifecycle. Ang library mismo ay gumagawa ng thread pool, humahawak ng Doze Mode, isinasaalang-alang ang bersyon ng Android, at nagbibigay ng pinag-isang API anuman ang antas ng API. Ang pagtatrabaho sa mga coroutine at RxJava ay sinusuportahan sa pamamagitan ng CoroutineWorker at RxWorker ayon sa pagkakabanggit.
Ang WorkManager ay nagbibigay ng built-in na suporta para sa LiveData upang subaybayan ang estado ng mga gawain. Ang pamamaraang getWorkInfoByIdLiveData ay nagbabalik ng LiveData<WorkInfo>, na naa-update sa bawat pagbabago ng estado: ENQUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED. Ito ay nagpapahintulot sa mga UI component na tumugon sa mga pagbabago nang walang manu-manong polling ng scheduler at walang memory leaks salamat sa Lifecycle-aware na mga component.
WorkManager.getInstance(context)
.getWorkInfoByIdLiveData(syncRequest.id)
.observe(viewLifecycleOwner) { workInfo ->
when (workInfo.state) {
WorkInfo.State.SUCCEEDED ->
showSuccess()
WorkInfo.State.FAILED ->
showError(workInfo.outputData)
else ->
showProgress()
}
}
Ang arkitektura ng WorkManager ay binuo sa paligid ng tatlong base class: Worker, WorkRequest at WorkManager. Ang Worker ay naglalaman ng lohika ng gawain, ang WorkRequest ay naglalarawan ng mga parameter ng pagpapatupad, at ang WorkManager ay namamahala sa pila at pag-iskedyul. Ang library ay gumagamit ng panloob na Room database para sa pag-iimbak ng estado ng lahat ng gawain.
Worker — ay isang abstract class na may iisang pamamaraang doWork, na tinatawag sa isang background thread. Ang pamamaraan ay nagbabalik ng ListenableWorker.Result — SUCCESS, FAILURE o RETRY. Ang WorkRequest ay nag-uugnay ng Worker sa mga parameter: timeout, tag, paunang pagkaantala, at mga limitasyon.
class SyncWorker(
context: Context,
params: WorkerParameters
) : Worker(context, params) {
override fun doWork(): Result {
return try {
val api = RetrofitClient.api
val response = api.syncData()
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
WorkManager ay nag-iiskedyul ng mga gawain nang pare-pareho anuman ang bersyon ng Android. Kapag tinawag ang enqueue, iniimbak ng library ang gawain sa Room, sinusuri ang kasalukuyang mga kondisyon, at pinipili ang pinakamainam na oras ng pagsisimula. Sa ilalim ng hood, maaaring gamitin ang JobScheduler, AlarmManager, o sariling scheduler — hindi na kailangang isipin ito ng developer.
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setInitialDelay(15, TimeUnit.MINUTES)
.addTag("sync")
.build()
WorkManager.getInstance(context)
.enqueue(syncRequest)
WorkManager ay sumusuporta sa dalawang uri ng mga kahilingan sa pagpapatupad: isang beses at panaka-nakang. Ang pagpili ng uri ay depende sa sitwasyon: ang gawain ay dapat isagawa nang isang beses o paulit-ulit sa isang tiyak na interval.
OneTimeWorkRequest ay para sa mga gawaing dapat isagawa nang isang beses. Ito ay maaaring pagpapadala ng log, pag-sync ng data pagkatapos ng awtorisasyon, pag-load ng configuration sa unang pagtakbo. Ang pagkaantala ay itinatakda sa pamamagitan ng setInitialDelay, at mga limitasyon sa pamamagitan ng setConstraints.
PeriodicWorkRequest ay angkop para sa mga paulit-ulit na gawain na may minimum na interval na 15 minuto. Ginagarantiyahan ng library na ang interval sa pagitan ng mga pagpapatupad ay hindi bababa sa tinukoy, ngunit maaaring mas mahaba dahil sa mga limitasyon ng device. Para sa mga gawaing may dalas na mas mababa sa 15 minuto, gamitin ang Handler o Timer sa Foreground Service.
| Parameter | OneTimeWorkRequest | PeriodicWorkRequest |
|---|---|---|
| Dalas | isang beses | paulit-ulit (min. 15 min) |
| Bilang | 1 pagpapatupad | hanggang kanselahin |
| Pagkaantala | setInitialDelay | setInitialDelay |
| Mga Chain | sumusuporta | hindi |
| Paggamit | pag-load, pag-sync | pagsubaybay, polling |
Mga limitasyon (constraints) sa WorkManager ay nagbibigay-daan sa pagtatakda ng mga kondisyon kung saan maaaring simulan ang isang gawain: koneksyon sa network (NetworkType), antas ng baterya (batteryNotLow), estado ng storage (StorageNotLow) at idle mode (DeviceIdle). Hindi magsisimula ang gawain hangga't hindi natutugunan ang lahat ng limitasyon.
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresCharging(true)
.setRequiresBatteryNotLow(true)
.build()
val request = OneTimeWorkRequestBuilder<ImageUploadWorker>()
.setConstraints(constraints)
.build()
Mga chain (chaining) ay nagbibigay-daan sa pag-oorganisa ng sunod-sunod o parallel na pagpapatupad ng mga gawain. Sinisimulan ng beginWith ang chain, ang then ay nagdaragdag ng susunod na Worker na isasagawa pagkatapos ng matagumpay na pagkumpleto ng nauna. Para sa parallel na pagpapatupad, gamitin ang workManager.enqueue(listOf(request1, request2)).
WorkManager.getInstance(context)
.beginWith(compressWorker)
.then(uploadWorker)
.then(cleanupWorker)
.enqueue()
// compress -> upload -> cleanup nang sunud-sunod
JobScheduler ay ipinakilala sa Android 5 (API 21) bilang isang system service para sa pag-iskedyul ng mga background na gawain. Dumating ang WorkManager bilang kapalit na may cross-platform API, awtomatikong paglipat, at karagdagang mga kakayahan: mga chain, garantiya ng pagpapatupad, mga tag, pagsubaybay sa estado sa pamamagitan ng LiveData.
Sa paglipat mula sa JobScheduler patungong WorkManager, kailangang i-convert ang JobService sa Worker, palitan ang JobInfo ng WorkRequest, at ang Context.getSystemService ng WorkManager API. Awtomatikong nilulutas ng WorkManager ang mga problema sa compatibility at pinangangasiwaan ang Doze Mode nang mas tama kaysa sa manu-manong pagpapatupad ng JobScheduler. Mga hakbang sa paglipat: 1) gumawa ng Worker class, 2) bumuo ng WorkRequest na may parehong kondisyon, 3) alisin ang JobService at JobInfo mula sa code at manifest.
Sinusuportahan ng WorkManager ang konsepto ng mga natatanging gawain sa pamamagitan ng ExistingWorkPolicy. Kung mayroon nang gawain na may tinukoy na pangalan, tinutukoy ng patakaran ang pag-uugali: KEEP (huwag gumawa ng bago), REPLACE (palitan ang umiiral), APPEND (idagdag sa dulo ng chain) at APPEND_OR_REPLACE. Ang UniqueWorkRequest ay maginhawa para sa mga gawaing hindi dapat ma-duplicate: pag-sync ng database, pag-load ng configuration, pagpapadala ng analytics package.
WorkManager.getInstance(context)
.enqueueUniqueWork(
"sync_data",
ExistingWorkPolicy.KEEP,
syncRequest
)
Sinusuportahan ng CoroutineWorker ang mekanismong setProgress na nagpapahintulot sa pagpasa ng mga pansamantalang resulta ng isang gawain. Ito ay kapaki-pakinabang para sa mahabang operasyon: pag-load ng malaking file, batch processing ng mga larawan, paglipat ng database. Ang UI ay maaaring mag-subscribe sa mga update sa pamamagitan ng getWorkInfosByTagLiveData at magpakita ng progreso sa real-time. Mayroon ding ForegroundInfo na paraan para sa pagsisimula ng Worker bilang Foreground Service na may notification kung ang gawain ay dapat makita ng user.
class ProgressWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
val total = 100
for (i in 1..total) {
setProgress(
workDataOf("progress" to i)
)
}
return Result.success()
}
}
Sinusuportahan ng WorkManager ang paglipat ng datos sa pagitan ng mga Worker sa pamamagitan ng InputData at OutputData. Ang InputData ay ginagawa sa yugto ng pagbuo ng WorkRequest sa pamamagitan ng Data.Builder at ipinapasa sa Worker sa pamamagitan ng inputData. Pagkatapos ng pagpapatupad, ang Worker ay bumubuo ng OutputData sa pamamagitan ng workDataOf o Data.Builder at ibinabalik ito kasama ng Result.success(outputData). Ang susunod na Worker sa chain ay tumatanggap ng outputData ng nauna bilang inputData nito. Ang datos ay iniimbak sa key-value na format na may suporta sa mga pangunahing uri: String, Int, Long, Boolean, Double. Ang maximum na laki ng Data ay 10 KB.
Sa pagsasagawa, maraming proyekto ang gumagamit ng WorkManager bilang tanging scheduler ng mga background na gawain. Inirerekomenda ng Google na ilipat ang lahat ng umiiral na JobService sa WorkManager, lalo na sa mga app na sumusuporta sa Android 4.4 (API 19) at mas mababa, kung saan hindi available ang JobScheduler at ang WorkManager ay gumagamit ng backup na mekanismo sa pamamagitan ng AlarmManager at BroadcastReceiver. Para sa pagsubok, nagbibigay ang WorkManager ng TestListenableWorkerBuilder at TestWorkerBuilder na nagpapahintulot sa pagsubok ng Worker sa JUnit tests nang walang tunay na scheduler.
Para sa pagsubok ng WorkManager, gamitin ang TestListenableWorkerBuilder mula sa AndroidX Test, na nagpapahintulot sa pagpapatakbo ng Worker sa isang nakahiwalay na kapaligiran at pagsuri sa ibinalik na Result. Ang library ay nagbibigay ng buong suporta para sa JUnit at Robolectric para sa modular na pagsubok nang walang tunay na scheduler. Sa kabuuan, ang WorkManager ay angkop para sa 80% ng mga gawain kung saan dating ginamit ang Service o JobScheduler.
Mga Madalas Itanong
Oo, ginagarantiyahan ng WorkManager ang pagpapatupad kahit pagkatapos ng pag-restart. Iniimbak ng library ang lahat ng hindi natapos na gawain sa Room database at ibinabalik ang mga ito sa pamamagitan ng BroadcastReceiver na na-trigger pagkatapos mag-boot ang system.
Worker ay gumagana sa background thread nang walang suporta sa coroutine o RxJava. CoroutineWorker ay gumagamit ng Kotlin coroutines na may suporta sa suspend functions at pagkansela sa pamamagitan ng coroutine scope. RxWorker ay gumagana sa Observable at Single, angkop para sa mga reactive chain.
Para sa pagkansela, gamitin ang workManager.cancelWorkById(id) o workManager.cancelAllWorkByTag(“tag”). Nagbibigay din ang library ng paraang cancelUniqueWork(“name”) para sa pagkansela ng mga natatanging gawain na may tinukoy na pangalan.
Ang minimum na interval para sa PeriodicWorkRequest ay 15 minuto. Ang limitasyong ito ay itinakda ng Google upang maiwasan ang labis na paggamit ng baterya. Kung ang gawain ay kailangang isagawa nang mas madalas, gamitin ang Foreground Service o Handler na may timer.
Oo, sinusuportahan ng WorkManager ang API 14+. Sa mga device na walang JobScheduler (mas mababa sa API 21), gumagamit ang library ng kombinasyon ng AlarmManager at BroadcastReceiver para sa pag-iskedyul ng mga gawain. Ginagawa nitong unibersal na solusyon ang WorkManager para sa mga background na gawain.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din