WorkManager — τι είναι, API και προγραμματισμός εργασιών

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-03-27 Χρόνος ανάγνωσης: 8 λεπ

WorkManager — είναι μια βιβλιοθήκη Jetpack Android, σχεδιασμένη για την εκτέλεση καθυστερημένων και εργασιών παρασκηνίου με εγγύηση εκτέλεσης. Σε αντίθεση με το Service ή το JobScheduler, το WorkManager αναλαμβάνει τη διαχείριση του κύκλου ζωής της εργασίας: την επανεκκινεί σε περίπτωση αποτυχίας, προσαρμόζεται στην έκδοση Android και λαμβάνει υπόψη τους περιορισμούς της συσκευής. Σύμφωνα με το Android Developers, 2026, το WorkManager είναι η προτιμώμενη λύση για τις περισσότερες λειτουργίες παρασκηνίου στη σύγχρονη ανάπτυξη Android.

Βασικά σημεία

  • WorkManager — είναι μια βιβλιοθήκη Jetpack για εργασίες παρασκηνίου με εγγυημένη εκτέλεση, ανεξάρτητα από την έκδοση Android.
  • Worker — η βασική κλάση για τον ορισμό της λογικής μιας εργασίας παρασκηνίου, την οποία η βιβλιοθήκη εκτελεί σε ξεχωριστό νήμα.
  • WorkRequest μπορεί να είναι εφάπαξ (OneTimeWorkRequest) ή περιοδικό (PeriodicWorkRequest) με ελάχιστο διάστημα 15 λεπτών.
  • Αλυσίδες εργασιών επιτρέπουν τη διαδοχική ή παράλληλη εκτέλεση πολλαπλών Worker.
  • Περιορισμοί (constraints) ορίζουν τις συνθήκες εκκίνησης: φόρτιση μπαταρίας, σύνδεση δικτύου, κατάσταση αποθήκευσης.

Τι είναι το WorkManager;

WorkManager — είναι μέρος του Android Jetpack, μια βιβλιοθήκη για τη διαχείριση εργασιών παρασκηνίου που πρέπει να εκτελούνται με εγγύηση, ανεξάρτητα από το αν η εφαρμογή βρίσκεται στο προσκήνιο ή έκλεισε από τον χρήστη. Η βιβλιοθήκη υποστηρίζει API 14+ και επιλέγει αυτόματα τον κατάλληλο μηχανισμό εκτέλεσης: JobScheduler σε Android 5+, BroadcastReceiver + AlarmManager σε παλαιότερες εκδόσεις.

Το βασικό χαρακτηριστικό του WorkManager είναι η εγγύηση εκτέλεσης. Εάν μια εργασία δεν ολοκληρώθηκε λόγω επανεκκίνησης συσκευής, διακοπής της εφαρμογής ή αποτυχίας, το WorkManager θα την επανεκκινήσει με την πρώτη ευκαιρία. Αυτό καθιστά τη βιβλιοθήκη ιδανική επιλογή για εργασίες κρίσιμης σημασίας: αποστολή αναλυτικών στοιχείων, συγχρονισμός βάσης δεδομένων, μεταφόρτωση αρχείων καταγραφής.

Σε αντίθεση με το Background Service, το WorkManager δεν απαιτεί διαχείριση νημάτων και κύκλου ζωής. Η βιβλιοθήκη δημιουργεί η ίδια μια ομάδα νημάτων, χειρίζεται τη λειτουργία Doze Mode, λαμβάνει υπόψη την έκδοση Android και παρέχει ένα ενιαίο API ανεξάρτητα από το επίπεδο API. Η εργασία με coroutines και RxJava υποστηρίζεται μέσω CoroutineWorker και RxWorker αντίστοιχα.

Παρακολούθηση κατάστασης μέσω LiveData

Το WorkManager παρέχει ενσωματωμένη υποστήριξη για LiveData για την παρακολούθηση της κατάστασης των εργασιών. Η μέθοδος getWorkInfoByIdLiveData επιστρέφει LiveData<WorkInfo>, η οποία ενημερώνεται σε κάθε αλλαγή κατάστασης: ENQUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED. Αυτό επιτρέπει στα στοιχεία UI να αντιδρούν σε αλλαγές χωρίς χειροκίνητη αναζήτηση του προγραμματιστή και χωρίς διαρροές μνήμης χάρη στα Lifecycle-aware στοιχεία.

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

Πώς λειτουργεί το WorkManager;

Η αρχιτεκτονική του WorkManager χτίζεται γύρω από τρεις βασικές κλάσεις: Worker, WorkRequest και WorkManager. Το Worker περιέχει τη λογική της εργασίας, το WorkRequest περιγράφει τις παραμέτρους εκτέλεσης και το WorkManager διαχειρίζεται την ουρά και τον προγραμματισμό. Η βιβλιοθήκη χρησιμοποιεί μια εσωτερική βάση δεδομένων Room για την αποθήκευση της κατάστασης όλων των εργασιών.

Worker και WorkRequest

Worker — είναι μια αφηρημένη κλάση με μία μόνο μέθοδο doWork, η οποία καλείται σε ένα νήμα παρασκηνίου. Η μέθοδος επιστρέφει ListenableWorker.Result — SUCCESS, FAILURE ή RETRY. Το WorkRequest συνδέει τον Worker με παραμέτρους: χρονικό όριο, ετικέτα, αρχική καθυστέρηση και περιορισμούς.

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

Προγραμματισμός μέσω WorkManager

WorkManager προγραμματίζει εργασίες με ενιαίο τρόπο ανεξάρτητα από την έκδοση Android. Κατά την κλήση του enqueue, η βιβλιοθήκη αποθηκεύει την εργασία στο Room, αξιολογεί τις τρέχουσες συνθήκες και επιλέγει τον βέλτιστο χρόνο εκκίνησης. Κάτω από το καπό, μπορεί να χρησιμοποιηθεί JobScheduler, AlarmManager ή δικός του προγραμματιστής — ο προγραμματιστής δεν χρειάζεται να το σκέφτεται.

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

WorkManager.getInstance(context)
    .enqueue(syncRequest)

Τύποι WorkRequest

WorkManager υποστηρίζει δύο τύπους αιτημάτων εκτέλεσης: εφάπαξ και περιοδικά. Η επιλογή τύπου εξαρτάται από το σενάριο: η εργασία πρέπει να εκτελεστεί μία φορά ή επαναλαμβανόμενα σε ένα συγκεκριμένο διάστημα.

OneTimeWorkRequest

OneTimeWorkRequest προορίζεται για εργασίες που πρέπει να εκτελεστούν μία φορά. Αυτό μπορεί να είναι η αποστολή ενός αρχείου καταγραφής, ο συγχρονισμός δεδομένων μετά από εξουσιοδότηση, η φόρτωση παραμέτρων κατά την πρώτη εκτέλεση. Η καθυστέρηση ρυθμίζεται μέσω setInitialDelay και οι περιορισμοί μέσω setConstraints.

PeriodicWorkRequest

PeriodicWorkRequest είναι κατάλληλο για επαναλαμβανόμενες εργασίες με ελάχιστο διάστημα 15 λεπτών. Η βιβλιοθήκη εγγυάται ότι το διάστημα μεταξύ εκτελέσεων δεν θα είναι μικρότερο από το καθορισμένο, αλλά μπορεί να είναι μεγαλύτερο λόγω περιορισμών συσκευής. Για εργασίες με συχνότητα μικρότερη από 15 λεπτά, χρησιμοποιήστε Handler ή Timer σε μια Foreground Service.

ΠαράμετροςOneTimeWorkRequestPeriodicWorkRequest
Συχνότηταεφάπαξεπαναλαμβανόμενο (ελάχ. 15 λεπτά)
Ποσότητα1 εκτέλεσηέως ακύρωση
ΚαθυστέρησηsetInitialDelaysetInitialDelay
Αλυσίδεςυποστηρίζειόχι
Χρήσηφόρτωση, συγχρονισμόςπαρακολούθηση, polling

Ρύθμιση περιορισμών και αλυσίδες εργασιών

Περιορισμοί (constraints) στο WorkManager επιτρέπουν τον ορισμό συνθηκών υπό τις οποίες μπορεί να ξεκινήσει μια εργασία: σύνδεση δικτύου (NetworkType), επίπεδο μπαταρίας (batteryNotLow), κατάσταση αποθήκευσης (StorageNotLow) και λειτουργία αναμονής (DeviceIdle). Η εργασία δεν θα ξεκινήσει έως ότου πληρούνται όλοι οι περιορισμοί.

kotlin
val constraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresCharging(true)
    .setRequiresBatteryNotLow(true)
    .build()

val request = OneTimeWorkRequestBuilder<ImageUploadWorker>()
    .setConstraints(constraints)
    .build()

Αλυσίδες (chaining) επιτρέπουν την οργάνωση διαδοχικής ή παράλληλης εκτέλεσης εργασιών. Η beginWith ξεκινά μια αλυσίδα, η then προσθέτει τον επόμενο Worker, ο οποίος θα εκτελεστεί μετά την επιτυχή ολοκλήρωση του προηγούμενου. Για παράλληλη εκτέλεση, χρησιμοποιήστε workManager.enqueue(listOf(request1, request2)).

kotlin
WorkManager.getInstance(context)
    .beginWith(compressWorker)
    .then(uploadWorker)
    .then(cleanupWorker)
    .enqueue()
    // compress -> upload -> cleanup διαδοχικά

Μετάβαση από JobScheduler σε WorkManager

JobScheduler εισήχθη στο Android 5 (API 21) ως υπηρεσία συστήματος για τον προγραμματισμό εργασιών παρασκηνίου. Το WorkManager ήρθε ως αντικατάσταση με ένα διασταυρωμένο API, αυτόματη μετάβαση και πρόσθετες δυνατότητες: αλυσίδες, εγγύηση εκτέλεσης, ετικέτες, παρακολούθηση κατάστασης μέσω LiveData.

Κατά τη μετάβαση από JobScheduler σε WorkManager, θα χρειαστεί να μετατρέψετε το JobService σε Worker, να αντικαταστήσετε το JobInfo με WorkRequest και το Context.getSystemService με το API του WorkManager. Το WorkManager λύνει αυτόματα προβλήματα συμβατότητας και χειρίζεται το Doze Mode πιο σωστά από τη χειροκίνητη υλοποίηση του JobScheduler. Βήματα μετάβασης: 1) δημιουργήστε μια κλάση Worker, 2) κατασκευάστε ένα WorkRequest με τις ίδιες συνθήκες, 3) αφαιρέστε το JobService και το JobInfo από τον κώδικα και το δηλωτικό.

UniqueWork για μοναδικές εργασίες

Το WorkManager υποστηρίζει την έννοια των μοναδικών εργασιών μέσω της ExistingWorkPolicy. Εάν μια εργασία με το καθορισμένο όνομα υπάρχει ήδη, η πολιτική καθορίζει τη συμπεριφορά: KEEP (μην δημιουργείτε νέα), REPLACE (αντικαταστήστε την υπάρχουσα), APPEND (προσθέστε στο τέλος της αλυσίδας) και APPEND_OR_REPLACE. Το UniqueWorkRequest είναι βολικό για εργασίες που δεν πρέπει να αντιγράφονται: συγχρονισμός βάσης δεδομένων, φόρτωση παραμέτρων, αποστολή πακέτου αναλυτικών στοιχείων.

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

Διαχείριση προόδου και ενδιάμεσων αποτελεσμάτων

Το CoroutineWorker υποστηρίζει τον μηχανισμό setProgress, που επιτρέπει τη μεταφορά ενδιάμεσων αποτελεσμάτων μιας εργασίας. Αυτό είναι χρήσιμο για μεγάλες λειτουργίες: φόρτωση μεγάλου αρχείου, μαζική επεξεργασία εικόνων, μετεγκατάσταση βάσης δεδομένων. Το UI μπορεί να εγγραφεί σε ενημερώσεις μέσω getWorkInfosByTagLiveData και να εμφανίζει την πρόοδο σε πραγματικό χρόνο. Διατίθεται επίσης η μέθοδος ForegroundInfo για την εκτέλεση Worker ως Foreground Service με ειδοποίηση, εάν η εργασία πρέπει να είναι ορατή στον χρήστη.

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 και OutputData για μεταφορά δεδομένων

Το WorkManager υποστηρίζει μεταφορά δεδομένων μεταξύ Worker μέσω InputData και OutputData. Το InputData δημιουργείται κατά την κατασκευή του WorkRequest μέσω Data.Builder και μεταφέρεται στον Worker μέσω inputData. Μετά την εκτέλεση, ο Worker δημιουργεί OutputData μέσω workDataOf ή Data.Builder και το επιστρέφει μαζί με Result.success(outputData). Ο επόμενος Worker στην αλυσίδα λαμβάνει το outputData του προηγούμενου ως inputData του. Τα δεδομένα αποθηκεύονται σε μορφή κλειδιού-τιμής με υποστήριξη βασικών τύπων: String, Int, Long, Boolean, Double. Το μέγιστο μέγεθος του Data είναι 10 KB.

Στην πράξη, πολλά έργα χρησιμοποιούν WorkManager ως τον μοναδικό προγραμματιστή εργασιών παρασκηνίου. Η Google συνιστά τη μετεγκατάσταση όλων των υπαρχόντων JobService σε WorkManager, ειδικά σε εφαρμογές που υποστηρίζουν Android 4.4 (API 19) και χαμηλότερα, όπου το JobScheduler δεν είναι διαθέσιμο και το WorkManager χρησιμοποιεί εφεδρικό μηχανισμό μέσω AlarmManager και BroadcastReceiver. Για δοκιμές, το WorkManager παρέχει TestListenableWorkerBuilder και TestWorkerBuilder, που επιτρέπουν τη δοκιμή Worker σε JUnit tests χωρίς πραγματικό προγραμματιστή.

Για δοκιμή του WorkManager, χρησιμοποιήστε το TestListenableWorkerBuilder από το AndroidX Test, το οποίο σας επιτρέπει να εκτελέσετε τον Worker σε απομονωμένο περιβάλλον και να ελέγξετε το επιστρεφόμενο Result. Η βιβλιοθήκη παρέχει πλήρη υποστήριξη JUnit και Robolectric για αρθρωτές δοκιμές χωρίς πραγματικό προγραμματιστή. Συνολικά, το WorkManager είναι κατάλληλο για το 80% των εργασιών όπου παλαιότερα χρησιμοποιούνταν Service ή JobScheduler.

Συχνές ερωτήσεις

Εγγυάται το WorkManager την εκτέλεση της εργασίας μετά από επανεκκίνηση της συσκευής;

Ναι, το WorkManager εγγυάται την εκτέλεση ακόμη και μετά από επανεκκίνηση. Η βιβλιοθήκη αποθηκεύει όλες τις ημιτελείς εργασίες στη βάση δεδομένων Room και τις επαναφέρει μέσω BroadcastReceiver, ο οποίος ενεργοποιείται μετά την εκκίνηση του συστήματος.

Ποια είναι η διαφορά μεταξύ Worker, CoroutineWorker και RxWorker;

Worker λειτουργεί σε νήμα παρασκηνίου χωρίς υποστήριξη coroutine ή RxJava. CoroutineWorker χρησιμοποιεί Kotlin-coroutines με υποστήριξη συναρτήσεων αναστολής και ακύρωσης μέσω του coroutine scope. RxWorker λειτουργεί με Observable και Single, κατάλληλο για αντιδραστικές αλυσίδες.

Πώς ακυρώνω μια εργασία στο WorkManager;

Για ακύρωση, χρησιμοποιήστε workManager.cancelWorkById(id) ή workManager.cancelAllWorkByTag(“tag”). Η βιβλιοθήκη παρέχει επίσης τη μέθοδο cancelUniqueWork(“name”) για ακύρωση μοναδικών εργασιών με καθορισμένο όνομα.

Ποιο είναι το ελάχιστο διάστημα για PeriodicWorkRequest;

Το ελάχιστο διάστημα για PeriodicWorkRequest είναι 15 λεπτά. Αυτός ο περιορισμός ορίστηκε από την Google για την αποφυγή υπερβολικής κατανάλωσης μπαταρίας. Εάν η εργασία πρέπει να εκτελείται συχνότερα, χρησιμοποιήστε Foreground Service ή Handler με χρονοδιακόπτη.

Υποστηρίζει το WorkManager Android 4.4 και χαμηλότερα;

Ναι, το WorkManager υποστηρίζει API 14+. Σε συσκευές χωρίς JobScheduler (κάτω από API 21), η βιβλιοθήκη χρησιμοποιεί συνδυασμό AlarmManager και BroadcastReceiver για τον προγραμματισμό εργασιών. Αυτό καθιστά το WorkManager μια καθολική λύση για εργασίες παρασκηνίου.

Σύνοψη

  • WorkManager — μια σύγχρονη βιβλιοθήκη Jetpack για εργασίες παρασκηνίου με εγγυημένη εκτέλεση σε όλες τις εκδόσεις Android.
  • Τρεις βασικές κλάσεις — Worker, WorkRequest και WorkManager — καλύπτουν όλα τα σενάρια προγραμματισμού και εκτέλεσης.
  • Δύο τύποι αιτημάτων — OneTimeWorkRequest και PeriodicWorkRequest — για εφάπαξ και επαναλαμβανόμενες εργασίες.
  • Περιορισμοί (δίκτυο, μπαταρία, αποθήκευση) προστατεύουν την εργασία από εκτέλεση σε δυσμενείς συνθήκες.
  • Αλυσίδες εργασιών εξασφαλίζουν διαδοχική εκτέλεση Worker με μεταφορά αποτελέσματος.
  • CoroutineWorker και RxWorker υποστηρίζουν ασύγχρονο προγραμματισμό μέσω coroutines και RxJava.
  • WorkManager αντικαθιστά το JobScheduler, το Service και το AlarmManager για τα περισσότερα σενάρια εργασιών παρασκηνίου.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης