WorkManager — nó là gì, API và lập lịch tác vụ

Tác giả: IT Sectr Đã đăng: 2026-03-27 Thời gian đọc: 8 phút

WorkManager là thư viện Android Jetpack được thiết kế để thực thi các tác vụ trì hoãn và nền với đảm bảo thực thi. Không giống như Service hay JobScheduler, WorkManager quản lý vòng đời tác vụ: khởi động lại khi thất bại, thích ứng với phiên bản Android và tính đến các ràng buộc của thiết bị. Theo Android Developers, 2026, WorkManager là giải pháp ưu tiên cho hầu hết các hoạt động nền trong phát triển Android hiện đại.

Những điểm chính

  • WorkManager là thư viện Jetpack cho các tác vụ nền với đảm bảo thực thi, bất kể phiên bản Android.
  • Worker là lớp cơ sở để định nghĩa logic tác vụ nền, mà thư viện thực thi trong một luồng riêng.
  • WorkRequest có thể một lần (OneTimeWorkRequest) và định kỳ (PeriodicWorkRequest) với khoảng thời gian tối thiểu 15 phút.
  • Chuỗi tác vụ cho phép sắp xếp thực thi tuần tự hoặc song song nhiều Worker.
  • Ràng buộc định nghĩa điều kiện khởi chạy: sạc pin, kết nối mạng, trạng thái bộ nhớ.

WorkManager là gì?

WorkManager là một phần của Android Jetpack, thư viện quản lý các tác vụ nền phải thực thi một cách đảm bảo, bất kể ứng dụng ở tiền cảnh hay đã bị người dùng đóng. Thư viện hỗ trợ API 14+ và tự động chọn cơ chế thực thi phù hợp: JobScheduler trên Android 5+, BroadcastReceiver + AlarmManager trên các phiên bản cũ hơn.

Tính năng chính của WorkManager là đảm bảo thực thi. Nếu tác vụ không hoàn thành do khởi động lại thiết bị, đóng ứng dụng hoặc lỗi, WorkManager sẽ khởi động lại nó ở cơ hội đầu tiên. Điều này làm cho thư viện trở thành lựa chọn lý tưởng cho các tác vụ quan trọng: gửi phân tích, đồng bộ cơ sở dữ liệu, tải nhật ký lên.

Không giống như Background Service, WorkManager không yêu cầu quản lý luồng và vòng đời. Thư viện tự tạo một nhóm luồng, xử lý Doze Mode, tính đến phiên bản Android và cung cấp API thống nhất bất kể cấp API. Hỗ trợ coroutine và RxJava có sẵn thông qua CoroutineWorker và RxWorker.

Theo dõi trạng thái qua LiveData

WorkManager cung cấp hỗ trợ LiveData tích hợp để theo dõi trạng thái tác vụ. Phương thức getWorkInfoByIdLiveData trả về LiveData<WorkInfo> được cập nhật mỗi khi trạng thái thay đổi: ENQUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED. Điều này cho phép các thành phần UI phản ứng với thay đổi mà không cần thăm dò thủ công bộ lập lịch và không bị rò rỉ bộ nhớ nhờ các thành phần 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 hoạt động như thế nào?

Kiến trúc của WorkManager được xây dựng xung quanh ba lớp cơ sở: Worker, WorkRequest và WorkManager. Worker chứa logic tác vụ, WorkRequest mô tả tham số thực thi, và WorkManager quản lý hàng đợi và lập lịch. Thư viện sử dụng cơ sở dữ liệu Room nội bộ để lưu trữ trạng thái của tất cả tác vụ.

Worker và WorkRequest

Worker là lớp trừu tượng với một phương thức duy nhất doWork được gọi trên luồng nền. Phương thức trả về ListenableWorker.Result — SUCCESS, FAILURE hoặc RETRY. WorkRequest liên kết Worker với các tham số: thời gian chờ, thẻ, độ trễ ban đầu và ràng buộc.

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

Lập lịch qua WorkManager

WorkManager lập lịch tác vụ đồng nhất bất kể phiên bản Android. Khi gọi enqueue, thư viện lưu tác vụ vào Room, đánh giá điều kiện hiện tại và chọn thời điểm thực thi tối ưu. Bên trong, nó có thể sử dụng JobScheduler, AlarmManager hoặc bộ lập lịch riêng — nhà phát triển không cần lo lắng về điều đó.

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

WorkManager.getInstance(context)
    .enqueue(syncRequest)

Các loại WorkRequest

WorkManager hỗ trợ hai loại yêu cầu thực thi: một lần và định kỳ. Việc chọn loại phụ thuộc vào kịch bản: tác vụ nên chạy một lần hay lặp lại ở một khoảng thời gian nhất định.

OneTimeWorkRequest

OneTimeWorkRequest được thiết kế cho các tác vụ cần thực thi một lần. Đó có thể là gửi nhật ký, đồng bộ dữ liệu sau khi xác thực, tải cấu hình khi khởi chạy lần đầu. Độ trễ được đặt qua setInitialDelay và ràng buộc qua setConstraints.

PeriodicWorkRequest

PeriodicWorkRequest phù hợp cho các tác vụ lặp lại với khoảng thời gian tối thiểu 15 phút. Thư viện đảm bảo khoảng thời gian giữa các lần chạy không nhỏ hơn chỉ định, nhưng có thể dài hơn do ràng buộc thiết bị. Đối với tác vụ có tần suất dưới 15 phút, hãy sử dụng Handler hoặc Timer trong Foreground Service.

Tham sốOneTimeWorkRequestPeriodicWorkRequest
Tần suấtmột lầnlặp lại (tối thiểu 15 phút)
Số lượng1 lần thực thicho đến khi hủy
Độ trễsetInitialDelaysetInitialDelay
Chuỗihỗ trợkhông
Sử dụngtải xuống, đồng bộgiám sát, thăm dò

Thiết lập ràng buộc và chuỗi tác vụ

Ràng buộc trong WorkManager cho phép đặt điều kiện để khởi chạy tác vụ: kết nối mạng (NetworkType), mức pin (batteryNotLow), trạng thái bộ nhớ (StorageNotLow) và chế độ không hoạt động (DeviceIdle). Tác vụ sẽ không bắt đầu cho đến khi tất cả ràng buộc được đáp ứng.

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

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

Chuỗi cho phép tổ chức thực thi tác vụ tuần tự hoặc song song. beginWith bắt đầu một chuỗi, then thêm Worker tiếp theo sẽ thực thi sau khi hoàn thành thành công Worker trước đó. Để thực thi song song, sử dụng workManager.enqueue(listOf(request1, request2)).

kotlin
WorkManager.getInstance(context)
    .beginWith(compressWorker)
    .then(uploadWorker)
    .then(cleanupWorker)
    .enqueue()
    // compress -> upload -> cleanup tuần tự

Di chuyển từ JobScheduler sang WorkManager

JobScheduler được giới thiệu trong Android 5 (API 21) như một dịch vụ hệ thống để lập lịch tác vụ nền. WorkManager ra đời để thay thế, cung cấp API đa nền tảng với di chuyển tự động và các khả năng bổ sung: chuỗi, đảm bảo thực thi, thẻ, theo dõi trạng thái qua LiveData.

Khi di chuyển từ JobScheduler sang WorkManager, bạn cần chuyển đổi JobService thành Worker, thay thế JobInfo bằng WorkRequest và Context.getSystemService bằng API WorkManager. WorkManager tự động xử lý các vấn đề tương thích và xử lý Doze Mode chính xác hơn so với triển khai JobScheduler thủ công. Các bước di chuyển: 1) tạo lớp Worker, 2) xây dựng WorkRequest với cùng điều kiện, 3) xóa JobService và JobInfo khỏi mã và tệp kê khai.

UniqueWork cho tác vụ duy nhất

WorkManager hỗ trợ khái niệm tác vụ duy nhất thông qua ExistingWorkPolicy. Nếu tác vụ với tên chỉ định đã tồn tại, chính sách xác định hành vi: KEEP (không tạo mới), REPLACE (thay thế tác vụ hiện có), APPEND (thêm vào cuối chuỗi) và APPEND_OR_REPLACE. UniqueWorkRequest thuận tiện cho các tác vụ không nên trùng lặp: đồng bộ cơ sở dữ liệu, tải cấu hình, gửi lô phân tích.

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

Xử lý tiến trình và kết quả trung gian

CoroutineWorker hỗ trợ cơ chế setProgress, cho phép truyền kết quả thực thi trung gian. Điều này hữu ích cho các hoạt động dài: tải tệp lớn, xử lý ảnh hàng loạt, di chuyển cơ sở dữ liệu. UI có thể đăng ký cập nhật qua getWorkInfosByTagLiveData và hiển thị tiến trình theo thời gian thực. Phương thức ForegroundInfo cũng có sẵn để chạy Worker dưới dạng Foreground Service với thông báo nếu tác vụ cần hiển thị cho người dùng.

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 và OutputData để truyền dữ liệu

WorkManager hỗ trợ truyền dữ liệu giữa các Worker qua InputDataOutputData. InputData được tạo trong quá trình xây dựng WorkRequest qua Data.Builder và được truyền đến Worker qua inputData. Sau khi thực thi, Worker tạo OutputData qua workDataOf hoặc Data.Builder và trả về cùng với Result.success(outputData). Worker tiếp theo trong chuỗi nhận outputData của Worker trước làm inputData của nó. Dữ liệu được lưu trữ ở định dạng khóa-giá trị với hỗ trợ các kiểu cơ bản: String, Int, Long, Boolean, Double. Kích thước tối đa của Data là 10 KB.

Trong thực tế, nhiều dự án sử dụng WorkManager làm bộ lập lịch tác vụ nền duy nhất. Google khuyến nghị di chuyển tất cả JobService hiện có sang WorkManager, đặc biệt trong các ứng dụng hỗ trợ Android 4.4 (API 19) trở xuống, nơi JobScheduler không khả dụng và WorkManager sử dụng cơ chế dự phòng qua AlarmManager và BroadcastReceiver. Để kiểm thử, WorkManager cung cấp TestListenableWorkerBuilder và TestWorkerBuilder, cho phép kiểm thử Worker trong các bài kiểm thử JUnit mà không cần bộ lập lịch thực.

Để kiểm thử WorkManager, hãy sử dụng TestListenableWorkerBuilder từ AndroidX Test, cho phép chạy Worker trong môi trường cách ly và xác minh Result trả về. Thư viện cung cấp hỗ trợ đầy đủ JUnit và Robolectric cho kiểm thử đơn vị mà không cần bộ lập lịch thực. Nhìn chung, WorkManager phù hợp cho 80% tác vụ mà trước đây sử dụng Service hoặc JobScheduler.

Các câu hỏi thường gặp

WorkManager có đảm bảo thực thi tác vụ sau khi khởi động lại thiết bị không?

Có, WorkManager đảm bảo thực thi ngay cả sau khi khởi động lại. Thư viện lưu tất cả tác vụ chưa hoàn thành trong cơ sở dữ liệu Room và khôi phục chúng bằng BroadcastReceiver được kích hoạt sau khi hệ thống khởi động.

Sự khác biệt giữa Worker, CoroutineWorker và RxWorker là gì?

Worker chạy trên luồng nền mà không hỗ trợ coroutine hoặc RxJava. CoroutineWorker sử dụng coroutine Kotlin với hỗ trợ hàm suspend và hủy qua phạm vi coroutine. RxWorker làm việc với Observable và Single, phù hợp cho chuỗi phản ứng.

Làm thế nào để hủy một tác vụ trong WorkManager?

Sử dụng workManager.cancelWorkById(id) hoặc workManager.cancelAllWorkByTag("tag"). Thư viện cũng cung cấp phương thức cancelUniqueWork("name") để hủy các tác vụ duy nhất với tên chỉ định.

Khoảng thời gian tối thiểu cho PeriodicWorkRequest là bao nhiêu?

Khoảng thời gian tối thiểu cho PeriodicWorkRequest là 15 phút. Giới hạn này được Google đặt ra để ngăn tiêu hao pin quá mức. Nếu tác vụ cần chạy thường xuyên hơn, hãy sử dụng Foreground Service hoặc Handler với bộ đếm thời gian.

WorkManager có hỗ trợ Android 4.4 trở xuống không?

Có, WorkManager hỗ trợ API 14+. Trên các thiết bị không có JobScheduler (dưới API 21), thư viện sử dụng kết hợp AlarmManager và BroadcastReceiver để lập lịch tác vụ. Điều này làm cho WorkManager trở thành giải pháp phổ quát cho các tác vụ nền.

Tổng kết

  • WorkManager là thư viện Jetpack hiện đại cho các tác vụ nền với đảm bảo thực thi trên tất cả phiên bản Android.
  • Ba lớp cơ sở — Worker, WorkRequest và WorkManager — bao phủ tất cả kịch bản lập lịch và thực thi.
  • Hai loại yêu cầu — OneTimeWorkRequest và PeriodicWorkRequest — cho tác vụ một lần và lặp lại.
  • Ràng buộc (mạng, pin, bộ nhớ) bảo vệ tác vụ khỏi thực thi trong điều kiện không thuận lợi.
  • Chuỗi tác vụ đảm bảo thực thi tuần tự Worker với truyền kết quả.
  • CoroutineWorker và RxWorker hỗ trợ lập trình bất đồng bộ qua coroutine và RxJava.
  • WorkManager thay thế JobScheduler, Service và AlarmManager trong hầu hết kịch bản tác vụ nền.

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm