WorkManager — ano ito, API at pag-iskedyul ng mga gawain

May-akda: IT Sectr Nai-publish: 2026-03-27 Oras ng pagbabasa: 8 min

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 isang Jetpack library para sa mga background na gawain na may garantisadong pagpapatupad, anuman ang bersyon ng Android.
  • Worker — ang base class para sa pagtukoy ng lohika ng isang background na gawain, na isinasagawa ng library sa isang hiwalay na thread.
  • WorkRequest ay maaaring isang beses (OneTimeWorkRequest) o panaka-nakang (PeriodicWorkRequest) na may minimum na interval na 15 minuto.
  • Mga chain ng gawain ay nagbibigay-daan sa pagbuo ng sunod-sunod o parallel na pagpapatupad ng maraming Worker.
  • Mga limitasyon (constraints) ay nagtatakda ng mga kondisyon sa pag-start: antas ng baterya, koneksyon sa network, estado ng storage.

Ano ang WorkManager?

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.

Pagsubaybay sa estado sa pamamagitan ng LiveData

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.

kotlin
WorkManager.getInstance(context)
    .getWorkInfoByIdLiveData(syncRequest.id)
    .observe(viewLifecycleOwner) { workInfo ->
        when (workInfo.state) {
            WorkInfo.State.SUCCEEDED ->
                showSuccess()
            WorkInfo.State.FAILED ->
                showError(workInfo.outputData)
            else ->
                showProgress()
        }
    }

Paano gumagana ang WorkManager?

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 at WorkRequest

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.

kotlin
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()
        }
    }
}

Pag-iskedyul sa pamamagitan ng WorkManager

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.

kotlin
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
    .setInitialDelay(15, TimeUnit.MINUTES)
    .addTag("sync")
    .build()

WorkManager.getInstance(context)
    .enqueue(syncRequest)

Mga Uri ng WorkRequest

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

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

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.

ParameterOneTimeWorkRequestPeriodicWorkRequest
Dalasisang besespaulit-ulit (min. 15 min)
Bilang1 pagpapatupadhanggang kanselahin
PagkaantalasetInitialDelaysetInitialDelay
Mga Chainsumusuportahindi
Paggamitpag-load, pag-syncpagsubaybay, polling

Pag-set up ng mga limitasyon at chain ng gawain

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.

kotlin
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)).

kotlin
WorkManager.getInstance(context)
    .beginWith(compressWorker)
    .then(uploadWorker)
    .then(cleanupWorker)
    .enqueue()
    // compress -> upload -> cleanup nang sunud-sunod

Paglipat mula sa JobScheduler patungong WorkManager

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.

UniqueWork para sa mga natatanging gawain

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.

kotlin
WorkManager.getInstance(context)
    .enqueueUniqueWork(
        "sync_data",
        ExistingWorkPolicy.KEEP,
        syncRequest
    )

Pagproseso ng progreso at pansamantalang resulta

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.

kotlin
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()
    }
}

InputData at OutputData para sa paglipat ng datos

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

Ginagarantiyahan ba ng WorkManager ang pagpapatupad ng gawain pagkatapos ng pag-restart ng device?

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.

Ano ang pagkakaiba sa pagitan ng Worker, CoroutineWorker at RxWorker?

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.

Paano kanselahin ang isang gawain sa WorkManager?

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.

Ano ang minimum na interval para sa PeriodicWorkRequest?

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.

Sinusuportahan ba ng WorkManager ang Android 4.4 at mas mababa?

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

  • WorkManager — ay isang modernong Jetpack library para sa mga background na gawain na may garantisadong pagpapatupad sa lahat ng bersyon ng Android.
  • Tatlong base class — Worker, WorkRequest at WorkManager — sumasaklaw sa lahat ng sitwasyon ng pag-iskedyul at pagpapatupad.
  • Dalawang uri ng kahilingan — OneTimeWorkRequest at PeriodicWorkRequest — para sa isang beses at paulit-ulit na mga gawain.
  • Mga limitasyon (network, baterya, storage) ay nagpoprotekta sa gawain mula sa pagpapatupad sa hindi kanais-nais na mga kondisyon.
  • Mga chain ng gawain ay nagtitiyak ng sunod-sunod na pagpapatupad ng Worker na may paglipat ng resulta.
  • CoroutineWorker at RxWorker ay sumusuporta sa asynchronous programming sa pamamagitan ng coroutine at RxJava.
  • WorkManager ay pumapalit sa JobScheduler, Service at AlarmManager para sa karamihan ng mga sitwasyon ng background na gawain.

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.

Pag-usapan ang proyekto

Basahin din