Android Academy · Pelajaran

WorkManager & Tugasan Latar Belakang

Jadualkan kerja latar belakang yang terjamin dengan WorkManager. Gunakan OneTimeWorkRequest, PeriodicWorkRequest, kekangan, penghantaran data dan rantaian kerja.

Pelajaran 5 daripada 613 langkah

WorkManager & Tugasan Latar Belakang ialah pelajaran Android Academy percuma di CoddyKit. Ini ialah pelajaran 5 daripada 6. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Android Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Android Academy merangkumi sejumlah 6 pelajaran.

Kerja Latar Belakang dalam Android

Android mengehadkan kerja latar belakang dengan ketat untuk menjimatkan bateri. Sebelum WorkManager, pembangun menggunakan:

  • AsyncTask (tidak digunakan lagi)
  • AlarmManager (tidak boleh dipercayai merentas but semula/Doze)
  • JobScheduler (API yang rumit)
  • Perkhidmatan (boleh ditamatkan, tiada percubaan semula)

WorkManager ialah penyelesaian yang disyorkan untuk kerja latar belakang yang boleh ditangguhkan dan dijamin berjalan.

Apakah WorkManager?

WorkManager menjamin kerja anda berjalan walaupun aplikasi ditamatkan atau peranti dibut semula. Ia:

  • Mengekalkan kerja merentas but semula
  • Mencuba semula secara automatik apabila gagal
  • Menyokong kekangan (WiFi sahaja, semasa mengecas sahaja dan sebagainya)
  • Berfungsi pada API 14+
  • Bersepadu dengan Kotlin Coroutines melalui CoroutineWorker

Persediaan

Tambahkan WorkManager pada app/build.gradle:

dependencies {
    implementation 'androidx.work:work-runtime-ktx:2.9.0'
}

Mencipta Worker

Lanjutkan CoroutineWorker dan laksanakan doWork(). Kembalikan Result.success(), Result.failure() atau Result.retry():

class SyncWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        return try {
            // This runs on a background coroutine
            val repo = UserRepository(applicationContext)
            repo.syncFromNetwork()
            Result.success()
        } catch (e: Exception) {
            if (runAttemptCount < 3) Result.retry()
            else Result.failure()
        }
    }
}

OneTimeWorkRequest

Jadualkan tugas sekali dan masukkannya ke dalam baris gilir:

val syncWork = OneTimeWorkRequestBuilder<SyncWorker>()
    .setInitialDelay(10, TimeUnit.MINUTES)  // optional delay
    .build()

WorkManager.getInstance(context).enqueue(syncWork)

// With a unique name (prevents duplicates):
WorkManager.getInstance(context).enqueueUniqueWork(
    "sync_work",
    ExistingWorkPolicy.KEEP,   // don't enqueue if already pending
    syncWork
)

PeriodicWorkRequest

Jadualkan tugas yang berulang. Selang minimum ialah 15 minit:

val periodicSync = PeriodicWorkRequestBuilder<SyncWorker>(
    repeatInterval = 1, TimeUnit.HOURS
).build()

WorkManager.getInstance(context).enqueueUniquePeriodicWork(
    "hourly_sync",
    ExistingPeriodicWorkPolicy.KEEP,
    periodicSync
)

Kekangan

Jalankan kerja hanya apabila syarat dipenuhi — bateri tidak lemah, WiFi bersambung dan sebagainya:

val constraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.UNMETERED)  // WiFi only
    .setRequiresBatteryNotLow(true)
    .setRequiresCharging(false)
    .build()

val work = OneTimeWorkRequestBuilder<SyncWorker>()
    .setConstraints(constraints)
    .build()

WorkManager.getInstance(context).enqueue(work)

Data Input & Output

Hantar data masuk dan keluar daripada Worker menggunakan objek Data:

// Enqueue with input data:
val inputData = workDataOf("user_id" to 42)
val work = OneTimeWorkRequestBuilder<SyncWorker>()
    .setInputData(inputData)
    .build()

// Inside the Worker:
class SyncWorker(...) : CoroutineWorker(...) {
    override suspend fun doWork(): Result {
        val userId = inputData.getInt("user_id", -1)

        // Pass output data back:
        val output = workDataOf("synced_count" to 10)
        return Result.success(output)
    }
}

Memerhatikan Status Kerja

Perhatikan kemajuan kerja menggunakan getWorkInfoByIdLiveData:

val workRequest = OneTimeWorkRequestBuilder<SyncWorker>().build()
WorkManager.getInstance(this).enqueue(workRequest)

WorkManager.getInstance(this)
    .getWorkInfoByIdLiveData(workRequest.id)
    .observe(this) { info ->
        when (info?.state) {
            WorkInfo.State.RUNNING   -> binding.tvStatus.text = "Syncing..."
            WorkInfo.State.SUCCEEDED -> binding.tvStatus.text = "Done!"
            WorkInfo.State.FAILED    -> binding.tvStatus.text = "Failed"
            else                     -> {}
        }
    }

Merangkaikan Kerja

Jalankan tugas secara berurutan atau selari menggunakan rangkaian kerja:

val downloadWork  = OneTimeWorkRequestBuilder<DownloadWorker>().build()
val processWork   = OneTimeWorkRequestBuilder<ProcessWorker>().build()
val uploadWork    = OneTimeWorkRequestBuilder<UploadWorker>().build()

// Sequential: download → process → upload
WorkManager.getInstance(context)
    .beginWith(downloadWork)
    .then(processWork)
    .then(uploadWork)
    .enqueue()

// Parallel then merge:
WorkManager.getInstance(context)
    .beginWith(listOf(downloadWork, processWork))  // both run in parallel
    .then(uploadWork)                              // runs after both finish
    .enqueue()

WorkManager berbanding Alternatif

Bila hendak menggunakan setiap pilihan:

  • WorkManager — kerja yang boleh ditangguhkan, dijamin berjalan dan berasaskan kekangan. Terbaik untuk penyegerakan, muat naik dan pembersihan.
  • Coroutines / ViewModel — kerja yang bergantung pada aplikasi yang terbuka. Berhenti apabila aplikasi ditamatkan.
  • AlarmManager — penggera pada masa tepat (peringatan kalendar). Memerlukan pengendalian bateri yang teliti.
  • Perkhidmatan Latar Depan — tugas yang berjalan lama dan diketahui oleh pengguna (main balik muzik, navigasi).

Semakan Pantas

Apakah selang ulangan minimum bagi PeriodicWorkRequest?

Ulang Kaji: WorkManager

WorkManager ialah alat yang sesuai untuk kerja latar belakang yang dijamin berjalan:

  • Lanjutkan CoroutineWorker dan laksanakan doWork()
  • Kembalikan Result.success(), .failure() atau .retry()
  • Gunakan OneTimeWorkRequest untuk pelaksanaan sekali dan PeriodicWorkRequest untuk pelaksanaan berulang
  • Tambahkan Constraints untuk WiFi sahaja, keadaan bateri dan sebagainya
  • Hantar data dengan workDataOf()
  • Rangkaikan tugas dengan beginWith().then().enqueue()

Seterusnya: komponen Material Design untuk UI yang menarik.

Percuma untuk bermula

Pelajari Kotlin dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
36
Pelajaran
152

Soalan Lazim

Adakah pelajaran “WorkManager & Tugasan Latar Belakang” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Android Academy, termasuk “WorkManager & Tugasan Latar Belakang”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Android Academy merangkumi sejumlah 6 pelajaran.

Apakah yang akan saya pelajari dalam “WorkManager & Tugasan Latar Belakang”?

Jadualkan kerja latar belakang yang terjamin dengan WorkManager. Gunakan OneTimeWorkRequest, PeriodicWorkRequest, kekangan, penghantaran data dan rantaian kerja. Anda berlatih Android Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Android Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Android Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 5 daripada 6.

Berapa lamakah pelajaran “WorkManager & Tugasan Latar Belakang” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Android Academy ini?

Ya. Setiap pelajaran Android Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Retrofit & API REST
  2. Memuatkan Imej dengan Coil
  3. Pengendalian Ralat & UX
  4. Pemberitahuan Tolak
  5. WorkManager & Tugasan Latar Belakang
  6. Menerbitkan ke Play Store
← Kembali ke Android Academy