Codelab ini adalah bagian dari kursus Dasar-Dasar Android Kotlin. Anda akan mendapatkan manfaat maksimal dari kursus ini jika menyelesaikan codelab secara berurutan. Semua codelab kursus tercantum di halaman landing codelab Dasar-Dasar Android Kotlin.
Pengantar
Sebagian besar aplikasi dunia nyata perlu melakukan tugas latar belakang yang berjalan lama. Misalnya, aplikasi dapat mengupload file ke server, menyinkronkan data dari server dan menyimpannya ke database Room, mengirim log ke server, atau menjalankan operasi yang mahal pada data. Operasi tersebut harus dilakukan di latar belakang, di luar thread UI (thread utama). Tugas latar belakang menggunakan resource perangkat yang terbatas, seperti RAM dan baterai. Hal ini akan memberikan pengalaman yang buruk bagi pengguna jika tidak ditangani dengan benar.
Dalam codelab ini, Anda akan mempelajari cara menggunakan WorkManager untuk menjadwalkan tugas latar belakang dengan cara yang optimal dan efisien. Untuk mempelajari lebih lanjut solusi lain yang tersedia untuk pemrosesan latar belakang di Android, lihat Panduan untuk pemrosesan latar belakang.
Yang harus sudah Anda ketahui
- Cara menggunakan Komponen Arsitektur Android ViewModel,LiveData, danRoom.
- Cara melakukan transformasi pada class LiveData.
- Cara membuat dan meluncurkan coroutine.
- Cara menggunakan adaptor binding dalam data binding.
- Cara memuat data yang di-cache menggunakan pola repositori.
Yang akan Anda pelajari
- Cara membuat Worker, yang mewakili unit kerja.
- Cara membuat WorkRequestuntuk meminta pekerjaan dilakukan.
- Cara menambahkan batasan ke WorkRequestuntuk menentukan cara dan waktu worker harus dijalankan.
- Cara menggunakan WorkManageruntuk menjadwalkan tugas latar belakang.
Yang akan Anda lakukan
- Buat pekerja untuk menjalankan tugas latar belakang guna mengambil data awal playlist video DevBytes dari jaringan.
- Jadwalkan pekerja untuk berjalan secara berkala.
- Tambahkan batasan ke WorkRequest.
- Jadwalkan WorkRequestberkala yang dijalankan sekali sehari.
Dalam codelab ini, Anda akan mengerjakan aplikasi DevBytes yang Anda kembangkan di codelab sebelumnya. (Jika tidak memiliki aplikasi ini, Anda dapat mendownload kode awal untuk pelajaran ini.)
Aplikasi DevBytes menampilkan daftar video DevByte, yang merupakan tutorial singkat yang dibuat oleh tim hubungan developer Android Google. Video ini memperkenalkan fitur developer dan praktik terbaik untuk pengembangan Android.
Anda meningkatkan pengalaman pengguna di aplikasi dengan melakukan pengambilan data awal video sekali sehari. Hal ini memastikan pengguna mendapatkan konten baru segera setelah mereka membuka aplikasi.

Dalam tugas ini, Anda akan mendownload dan memeriksa kode awal.
Langkah 1: Download dan jalankan aplikasi awal
Anda dapat terus mengerjakan aplikasi DevBytes yang telah Anda buat di codelab sebelumnya (jika Anda memilikinya). Atau, Anda dapat mendownload aplikasi awal.
Dalam tugas ini, Anda akan mendownload dan menjalankan aplikasi awal serta memeriksa kode awal.
- Jika Anda belum memiliki aplikasi DevBytes, download kode awal DevBytes untuk codelab ini dari project DevBytesRepository dari GitHub.
- Buka zip kode dan buka project di Android Studio.
- Hubungkan perangkat pengujian atau emulator Anda ke internet, jika belum terhubung. Buat dan jalankan aplikasi. Aplikasi mengambil daftar video DevByte dari jaringan dan menampilkannya.
- Di aplikasi, ketuk video apa pun untuk membukanya di aplikasi YouTube.
Langkah 2: Jelajahi kode
Aplikasi awal dilengkapi dengan banyak kode yang diperkenalkan dalam codelab sebelumnya. Kode awal untuk codelab ini memiliki modul jaringan, antarmuka pengguna, cache offline, dan repositori. Anda dapat berfokus pada penjadwalan tugas latar belakang menggunakan WorkManager. 
- Di Android Studio, luaskan semua paket.
- Jelajahi paket database. Paket ini berisi entity database dan database lokal, yang diimplementasikan menggunakanRoom.
- Jelajahi paket repository. Paket ini berisi classVideosRepositoryyang memisahkan lapisan data dari bagian aplikasi lainnya.
- Pelajari kode awal lainnya sendiri, dan dengan bantuan codelab sebelumnya.
WorkManager adalah salah satu Komponen Arsitektur Android dan bagian dari Android Jetpack. WorkManager ditujukan untuk pekerjaan latar belakang yang dapat ditangguhkan dan memerlukan eksekusi yang terjamin:
- Dapat ditangguhkan berarti tugas tidak perlu dijalankan secara langsung. Misalnya, mengirim data analisis ke server atau menyinkronkan database di latar belakang adalah pekerjaan yang dapat ditunda.
- Eksekusi terjamin berarti tugas akan berjalan meskipun aplikasi ditutup atau perangkat dimulai ulang.

Saat menjalankan pekerjaan latar belakang, WorkManager menangani masalah kompatibilitas dan praktik terbaik untuk kesehatan baterai dan sistem. WorkManager menawarkan kompatibilitas kembali ke API level 14. WorkManager memilih cara yang tepat untuk menjadwalkan tugas latar belakang, bergantung pada level API perangkat. Aplikasi ini dapat menggunakan JobScheduler (di API 23 dan yang lebih tinggi) atau kombinasi AlarmManager dan BroadcastReceiver.
WorkManager juga memungkinkan Anda menetapkan kriteria kapan tugas latar belakang berjalan. Misalnya, Anda mungkin ingin tugas berjalan hanya saat status baterai, status jaringan, atau status pengisian daya memenuhi kriteria tertentu. Anda akan mempelajari cara menyetel batasan nanti dalam codelab ini.
Dalam codelab ini, Anda akan menjadwalkan tugas untuk mengambil playlist video DevBytes dari jaringan setiap hari. Untuk menjadwalkan tugas ini, Anda menggunakan library WorkManager.
- Buka file build.gradle (Module:app)dan tambahkan dependensiWorkManagerke project.
 Jika Anda menggunakan versi terbaru library, aplikasi solusi akan dikompilasi seperti yang diharapkan. Jika tidak, coba selesaikan masalahnya, atau kembali ke versi pustaka yang ditampilkan di bawah.
// WorkManager dependency
def work_version = "1.0.1"
implementation "android.arch.work:work-runtime-ktx:$work_version"- Sinkronkan project Anda dan pastikan tidak ada error kompilasi.
Sebelum menambahkan kode ke project, pahami class berikut di library WorkManager:
- Worker
 Di class ini, Anda menentukan pekerjaan sebenarnya (tugas) yang akan dijalankan di latar belakang. Anda memperluas class ini dan mengganti metode- doWork(). Metode- doWork()adalah tempat Anda menempatkan kode yang akan dijalankan di latar belakang, seperti menyinkronkan data dengan server atau memproses gambar. Anda akan menerapkan- Workerdalam tugas ini.
- WorkRequest
 Class ini merepresentasikan permintaan untuk menjalankan pekerja di latar belakang. Gunakan- WorkRequestuntuk mengonfigurasi cara dan waktu menjalankan tugas pekerja, dengan bantuan- Constraintsseperti perangkat dicolokkan atau Wi-Fi terhubung. Anda akan menerapkan- WorkRequestdi tugas selanjutnya.
- WorkManager
 Kelas ini menjadwalkan dan menjalankan- WorkRequestAnda.- WorkManagermenjadwalkan permintaan kerja dengan cara menyebarkan beban pada resource sistem, sekaligus memenuhi batasan yang Anda tetapkan. Anda akan menerapkan- WorkManagerdi tugas selanjutnya.
Langkah 1: Buat pekerja
Dalam tugas ini, Anda akan menambahkan Worker untuk melakukan pengambilan data awal playlist video DevBytes di latar belakang.
- Di dalam paket devbyteviewer, buat paket baru bernamawork.
- Di dalam paket work, buat class Kotlin baru bernamaRefreshDataWorker.
- Perluas class RefreshDataWorkerdari classCoroutineWorker. TeruskancontextdanWorkerParameterssebagai parameter konstruktor.
class RefreshDataWorker(appContext: Context, params: WorkerParameters) :
       CoroutineWorker(appContext, params) {
}- Untuk mengatasi error class abstrak, ganti metode doWork()di dalam classRefreshDataWorker.
override suspend fun doWork(): Result {
  return Result.success()
}Fungsi penangguhan adalah fungsi yang dapat dijeda dan dilanjutkan nanti. Fungsi penangguhan dapat menjalankan operasi yang berjalan lama dan menunggu hingga selesai tanpa memblokir thread utama.
Langkah 2: Implementasikan doWork()
Metode doWork() di dalam class Worker dipanggil di thread latar belakang. Metode ini melakukan pekerjaan secara sinkron, dan harus menampilkan objek ListenableWorker.Result. Sistem Android memberi Worker waktu maksimum 10 menit untuk menyelesaikan eksekusinya dan menampilkan objek ListenableWorker.Result. Setelah waktu ini berakhir, sistem akan menghentikan Worker secara paksa.
Untuk membuat objek ListenableWorker.Result, panggil salah satu metode statis berikut untuk menunjukkan status penyelesaian pekerjaan latar belakang:
- Result.success()—tugas berhasil diselesaikan.
- Result.failure()—tugas selesai dengan kegagalan permanen.
- Result.retry()—tugas mengalami kegagalan sementara dan harus dicoba lagi.
Dalam tugas ini, Anda akan mengimplementasikan metode doWork() untuk mengambil playlist video DevBytes dari jaringan. Anda dapat menggunakan kembali metode yang ada di class VideosRepository untuk mengambil data dari jaringan.
- Di class RefreshDataWorker, di dalamdoWork(), buat dan buat instance objekVideosDatabasedan objekVideosRepository.
override suspend fun doWork(): Result {
   val database = getDatabase(applicationContext)
   val repository = VideosRepository(database)
   return Result.success()
}- Di class RefreshDataWorker, di dalamdoWork(), di atas pernyataanreturn, panggil metoderefreshVideos()di dalam bloktry. Tambahkan log untuk melacak kapan pekerja dijalankan.
try {
   repository.refreshVideos( )
   Timber.d("Work request for sync is run")
   } catch (e: HttpException) {
   return Result.retry()
}Untuk mengatasi error "Referensi yang belum terselesaikan", impor retrofit2.HttpException.
- Berikut adalah class RefreshDataWorkerlengkap untuk referensi Anda:
class RefreshDataWorker(appContext: Context, params: WorkerParameters) :
       CoroutineWorker(appContext, params) {
   override suspend fun doWork(): Result {
       val database = getDatabase(applicationContext)
       val repository = VideosRepository(database)
       try {
           repository.refreshVideos()
       } catch (e: HttpException) {
           return Result.retry()
       }
       return Result.success()
   }
}Worker menentukan unit kerja, dan WorkRequest menentukan cara dan waktu untuk menjalankan pekerjaan. Ada dua penerapan konkret class WorkRequest: 
- Class OneTimeWorkRequestditujukan untuk tugas satu kali. (Tugas sekali saja hanya terjadi satu kali.)
- Class PeriodicWorkRequestditujukan untuk pekerjaan berkala, pekerjaan yang berulang secara berkala.
Tugas dapat bersifat sekali waktu atau berkala, jadi pilih kelas yang sesuai. Untuk mengetahui informasi selengkapnya tentang cara menjadwalkan pekerjaan berulang, lihat dokumentasi pekerjaan berulang.
Dalam tugas ini, Anda akan menentukan dan menjadwalkan WorkRequest untuk menjalankan pekerja yang Anda buat di tugas sebelumnya. 
Langkah 1: Siapkan pekerjaan berulang
Dalam aplikasi Android, class Application adalah class dasar yang berisi semua komponen lain, seperti aktivitas dan layanan. Saat proses untuk aplikasi atau paket Anda dibuat, class Application (atau subclass Application) dibuat instance-nya sebelum class lainnya.
Dalam aplikasi contoh ini, class DevByteApplication adalah subclass dari class Application. Class DevByteApplication adalah tempat yang tepat untuk menjadwalkan WorkManager.
- Di class DevByteApplication, buat metode bernamasetupRecurringWork()untuk menyiapkan pekerjaan latar belakang berulang.
/**
* Setup WorkManager background job to 'fetch' new network data daily.
*/
private fun setupRecurringWork() {
}- Di dalam metode setupRecurringWork(), buat dan lakukan inisialisasi permintaan tugas berkala untuk dijalankan sekali sehari, menggunakan metodePeriodicWorkRequestBuilder(). Teruskan classRefreshDataWorkeryang Anda buat di tugas sebelumnya. Teruskan interval pengulangan1dengan satuan waktuTimeUnit.DAYS.
val repeatingRequest = PeriodicWorkRequestBuilder<RefreshDataWorker>(1, TimeUnit.DAYS)
       .build()Untuk mengatasi error, impor java.util.concurrent.TimeUnit.
Langkah 2: Jadwalkan WorkRequest dengan WorkManager
Setelah menentukan WorkRequest, Anda dapat menjadwalkannya dengan WorkManager menggunakan metode enqueueUniquePeriodicWork(). Metode ini memungkinkan Anda menambahkan PeriodicWorkRequest bernama unik ke antrean, dengan hanya satu PeriodicWorkRequest dengan nama tertentu yang dapat aktif dalam satu waktu.
Misalnya, Anda mungkin hanya ingin satu operasi sinkronisasi yang aktif. Jika satu operasi sinkronisasi tertunda, Anda dapat memilih untuk membiarkannya berjalan atau menggantinya dengan tugas baru, menggunakan ExistingPeriodicWorkPolicy.
Untuk mempelajari lebih lanjut cara menjadwalkan WorkRequest, lihat dokumentasi WorkManager.
- Di class RefreshDataWorker, di awal class, tambahkan objek pendamping. Tentukan nama pekerja untuk mengidentifikasi pekerja ini secara unik.
companion object {
   const val WORK_NAME = "com.example.android.devbyteviewer.work.RefreshDataWorker"
}- Di class DevByteApplication, di akhir metodesetupRecurringWork(), jadwalkan pekerjaan menggunakan metodeenqueueUniquePeriodicWork(). Teruskan enumKEEPuntuk ExistingPeriodicWorkPolicy. TeruskanrepeatingRequestsebagai parameterPeriodicWorkRequest.
WorkManager.getInstance().enqueueUniquePeriodicWork(
       RefreshDataWorker.WORK_NAME,
       ExistingPeriodicWorkPolicy.KEEP,
       repeatingRequest)Jika ada tugas tertunda (belum selesai) dengan nama yang sama, parameter ExistingPeriodicWorkPolicy.KEEP akan membuat WorkManager mempertahankan tugas berkala sebelumnya dan membuang permintaan tugas baru.
- Di awal class DevByteApplication, buat objekCoroutineScope. TeruskanDispatchers.Defaultsebagai parameter konstruktor.
private val applicationScope = CoroutineScope(Dispatchers.Default)- Di class DevByteApplication, tambahkan metode baru bernamadelayedInit()untuk memulai coroutine.
private fun delayedInit() {
   applicationScope.launch {
   }
}- Di dalam metode delayedInit(), panggilsetupRecurringWork().
- Pindahkan inisialisasi Timber dari metode onCreate()ke metodedelayedInit().
private fun delayedInit() {
   applicationScope.launch {
       Timber.plant(Timber.DebugTree())
       setupRecurringWork()
   }
}- Di class DevByteApplication, di akhir metodeonCreate(), tambahkan panggilan ke metodedelayedInit().
override fun onCreate() {
   super.onCreate()
   delayedInit()
}- Buka panel Logcat di bagian bawah jendela Android Studio. Filter di RefreshDataWorker.
- Jalankan aplikasi. WorkManagerakan segera menjadwalkan pekerjaan berulang Anda.
 Di panel Logcat, perhatikan pernyataan log yang menunjukkan bahwa permintaan tugas dijadwalkan, lalu berhasil dijalankan.
D/RefreshDataWorker: Work request for sync is run I/WM-WorkerWrapper: Worker result SUCCESS for Work [...]
Log WM-WorkerWrapper ditampilkan dari library WorkManager, sehingga Anda tidak dapat mengubah pesan log ini.
Langkah 3: (Opsional) Jadwalkan WorkRequest untuk interval minimum
Pada langkah ini, Anda mengurangi interval waktu dari 1 hari menjadi 15 menit. Anda melakukan ini agar dapat melihat cara kerja log untuk permintaan tugas berkala.
- Di class DevByteApplication, di dalam metodesetupRecurringWork(), jadikan definisirepeatingRequestsaat ini sebagai komentar. Tambahkan permintaan kerja baru dengan interval pengulangan berkala15menit.
// val repeatingRequest = PeriodicWorkRequestBuilder<RefreshDataWorker>(1, TimeUnit.DAYS)
//        .build()
val repeatingRequest = PeriodicWorkRequestBuilder<RefreshDataWorker>(15, TimeUnit.MINUTES)
       .build()- Buka panel Logcat di Android Studio dan filter di RefreshDataWorker. Untuk menghapus log sebelumnya, klik ikon Clear logcat . .
- Jalankan aplikasi, dan WorkManagerakan segera menjadwalkan pekerjaan berulang Anda. Di panel Logcat, perhatikan log—permintaan pekerjaan dijalankan sekali setiap 15 menit. Tunggu 15 menit untuk melihat kumpulan log permintaan tugas lainnya. Anda dapat membiarkan aplikasi berjalan atau menutupnya; pengelola tugas akan tetap berjalan.
 Perhatikan bahwa interval terkadang kurang dari 15 menit, dan terkadang lebih dari 15 menit. (Waktu yang tepat tunduk pada pengoptimalan baterai OS.)
12:44:40 D/RefreshDataWorker: Work request for sync is run 12:44:40 I/WM-WorkerWrapper: Worker result SUCCESS for Work 12:59:24 D/RefreshDataWorker: Work request for sync is run 12:59:24 I/WM-WorkerWrapper: Worker result SUCCESS for Work 13:15:03 D/RefreshDataWorker: Work request for sync is run 13:15:03 I/WM-WorkerWrapper: Worker result SUCCESS for Work 13:29:22 D/RefreshDataWorker: Work request for sync is run 13:29:22 I/WM-WorkerWrapper: Worker result SUCCESS for Work 13:44:26 D/RefreshDataWorker: Work request for sync is run 13:44:26 I/WM-WorkerWrapper: Worker result SUCCESS for Work
 Selamat! Anda telah membuat pekerja dan menjadwalkan permintaan pekerjaan dengan WorkManager. Namun, ada masalah: Anda tidak menentukan batasan apa pun. WorkManager akan menjadwalkan tugas sekali sehari, meskipun daya baterai perangkat lemah, perangkat dalam mode tidur, atau tidak memiliki koneksi jaringan. Hal ini akan memengaruhi baterai dan performa perangkat serta dapat mengakibatkan pengalaman pengguna yang buruk.
Pada tugas berikutnya, Anda akan mengatasi masalah ini dengan menambahkan batasan.
Pada tugas sebelumnya, Anda menggunakan WorkManager untuk menjadwalkan permintaan kerja. Dalam tugas ini, Anda menambahkan kriteria untuk kapan harus menjalankan pekerjaan.
Saat menentukan WorkRequest, Anda dapat menentukan batasan waktu berjalannya Worker. Contohnya, Anda ingin menetapkan bahwa tugas hanya berjalan ketika perangkat sedang tidak melakukan aktivitas, atau hanya ketika perangkat dicolokkan dan dihubungkan ke Wi-Fi. Anda juga dapat menentukan kebijakan mundur untuk mencoba ulang tugas. Batasan yang didukung adalah metode set di Constraints.Builder. Untuk mempelajari lebih lanjut, lihat Menentukan Permintaan Pekerjaan Anda.
Langkah 1: Tambahkan objek Constraints dan tetapkan satu batasan
Pada langkah ini, Anda akan membuat objek Constraints dan menetapkan satu batasan pada objek, yaitu batasan jenis jaringan. (Akan lebih mudah untuk melihat log hanya dengan satu batasan. Pada langkah selanjutnya, Anda akan menambahkan batasan lainnya.)
- Di class DevByteApplication, di awalsetupRecurringWork(), tentukanvaldari jenisConstraints. Gunakan metodeConstraints.Builder().
val constraints = Constraints.Builder()Untuk mengatasi error, impor androidx.work.Constraints.
- Gunakan metode setRequiredNetworkType()untuk menambahkan batasan jenis jaringan ke objekconstraints. Gunakan enumUNMETEREDagar permintaan pekerjaan hanya berjalan saat perangkat berada di jaringan tidak berbayar.
.setRequiredNetworkType(NetworkType.UNMETERED)- Gunakan metode build()untuk membuat batasan dari builder.
val constraints = Constraints.Builder()
       .setRequiredNetworkType(NetworkType.UNMETERED)
       .build()Sekarang Anda perlu menyetel objek Constraints yang baru dibuat ke permintaan kerja.
- Di class DevByteApplication, di dalam metodesetupRecurringWork(), tetapkan objekConstraintske permintaan pekerjaan berkala,repeatingRequest. Untuk menetapkan batasan, tambahkan metodesetConstraints()di atas panggilan metodebuild().
       val repeatingRequest = PeriodicWorkRequestBuilder<RefreshDataWorker>(15, TimeUnit.MINUTES)
               .setConstraints(constraints)
               .build()Langkah 2: Jalankan aplikasi dan perhatikan log
Pada langkah ini, Anda menjalankan aplikasi dan melihat permintaan kerja yang dibatasi berjalan di latar belakang pada interval tertentu.
- Uninstal aplikasi dari perangkat atau emulator untuk membatalkan tugas yang dijadwalkan sebelumnya.
- Buka panel Logcat di Android Studio. Di panel Logcat, hapus log sebelumnya dengan mengklik ikon Clear logcat di sebelah kiri. Filter di di sebelah kiri. Filter diwork.
- Nonaktifkan Wi-Fi di perangkat atau emulator, sehingga Anda dapat melihat cara kerja batasan. Kode saat ini hanya menetapkan satu batasan, yang menunjukkan bahwa permintaan hanya boleh berjalan di jaringan tanpa kuota. Karena Wi-Fi nonaktif, perangkat tidak terhubung ke jaringan, baik berbayar maupun tidak berbayar. Oleh karena itu, batasan ini tidak akan terpenuhi.
- Jalankan aplikasi dan perhatikan panel Logcat. WorkManagermenjadwalkan tugas latar belakang dengan segera. Karena batasan jaringan tidak terpenuhi, tugas tidak dijalankan.
11:31:44 D/DevByteApplication: Periodic Work request for sync is scheduled
- Aktifkan Wi-Fi di perangkat atau emulator dan amati panel Logcat. Sekarang, tugas latar belakang terjadwal dijalankan kira-kira setiap 15 menit, selama batasan jaringan terpenuhi.
11:31:44 D/DevByteApplication: Periodic Work request for sync is scheduled 11:31:47 D/RefreshDataWorker: Work request for sync is run 11:31:47 I/WM-WorkerWrapper: Worker result SUCCESS for Work [...] 11:46:45 D/RefreshDataWorker: Work request for sync is run 11:46:45 I/WM-WorkerWrapper: Worker result SUCCESS for Work [...] 12:03:05 D/RefreshDataWorker: Work request for sync is run 12:03:05 I/WM-WorkerWrapper: Worker result SUCCESS for Work [...] 12:16:45 D/RefreshDataWorker: Work request for sync is run 12:16:45 I/WM-WorkerWrapper: Worker result SUCCESS for Work [...] 12:31:45 D/RefreshDataWorker: Work request for sync is run 12:31:45 I/WM-WorkerWrapper: Worker result SUCCESS for Work [...] 12:47:05 D/RefreshDataWorker: Work request for sync is run 12:47:05 I/WM-WorkerWrapper: Worker result SUCCESS for Work [...] 13:01:45 D/RefreshDataWorker: Work request for sync is run 13:01:45 I/WM-WorkerWrapper: Worker result SUCCESS for Work [...]
Langkah 3: Tambahkan batasan lainnya
Pada langkah ini, Anda menambahkan batasan berikut ke PeriodicWorkRequest: 
- Daya baterai tidak lemah.
- Pengisian daya perangkat.
- Perangkat dalam kondisi tidak ada aktivitas; hanya tersedia di level API 23 (Android M) dan yang lebih tinggi.
Terapkan kode berikut di class DevByteApplication.
- Di class DevByteApplication, di dalam metodesetupRecurringWork(), tunjukkan bahwa permintaan pekerjaan hanya boleh berjalan jika baterai tidak lemah. Tambahkan batasan sebelum panggilan metodebuild(), dan gunakan metodesetRequiresBatteryNotLow().
.setRequiresBatteryNotLow(true)- Perbarui permintaan tugas agar hanya berjalan saat perangkat sedang mengisi daya. Tambahkan batasan sebelum panggilan metode build(), dan gunakan metodesetRequiresCharging().
.setRequiresCharging(true)- Perbarui permintaan kerja agar hanya berjalan saat perangkat tidak ada aktivitas. Tambahkan batasan sebelum panggilan metode build(), dan gunakan metodesetRequiresDeviceIdle(). Batasan ini menjalankan permintaan tugas hanya saat pengguna tidak sedang menggunakan perangkat secara aktif. Fitur ini hanya tersedia di Android 6.0 (Marshmallow) dan yang lebih tinggi, jadi tambahkan kondisi untuk SDK versiMdan yang lebih tinggi.
.apply {
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
       setRequiresDeviceIdle(true)
   }
}Berikut definisi lengkap objek constraints.
val constraints = Constraints.Builder()
       .setRequiredNetworkType(NetworkType.UNMETERED)
       .setRequiresBatteryNotLow(true)
       .setRequiresCharging(true)
       .apply {
           if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
               setRequiresDeviceIdle(true)
           }
       }
       .build()- Dalam metode setupRecurringWork(), ubah kembali interval permintaan menjadi sekali sehari.
val repeatingRequest = PeriodicWorkRequestBuilder<RefreshDataWorker>(1, TimeUnit.DAYS)
       .setConstraints(constraints)
       .build()Berikut adalah penerapan lengkap metode setupRecurringWork(), dengan log sehingga Anda dapat melacak kapan permintaan pekerjaan berkala dijadwalkan. 
private fun setupRecurringWork() {
       val constraints = Constraints.Builder()
               .setRequiredNetworkType(NetworkType.UNMETERED)
               .setRequiresBatteryNotLow(true)
               .setRequiresCharging(true)
               .apply {
                   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                       setRequiresDeviceIdle(true)
                   }
               }
               .build()
       val repeatingRequest = PeriodicWorkRequestBuilder<RefreshDataWorker>(1, TimeUnit.DAYS)
               .setConstraints(constraints)
               .build()
       
       Timber.d("Periodic Work request for sync is scheduled")
       WorkManager.getInstance().enqueueUniquePeriodicWork(
               RefreshDataWorker.WORK_NAME,
               ExistingPeriodicWorkPolicy.KEEP,
               repeatingRequest)
   }- Untuk menghapus permintaan kerja yang dijadwalkan sebelumnya, uninstal aplikasi DevBytes dari perangkat atau emulator Anda.
- Jalankan aplikasi, dan WorkManagerakan segera menjadwalkan permintaan pekerjaan. Permintaan pekerjaan berjalan sekali sehari, saat semua batasan terpenuhi.
- Permintaan kerja ini akan berjalan di latar belakang selama aplikasi diinstal, meskipun aplikasi tidak berjalan. Oleh karena itu, Anda harus meng-uninstal aplikasi dari ponsel.
Bagus! Anda telah menerapkan dan menjadwalkan permintaan tugas yang hemat baterai untuk pengambilan awal video harian di aplikasi DevBytes. WorkManager akan menjadwalkan dan menjalankan tugas, serta mengoptimalkan resource sistem. Pengguna Anda dan baterai mereka akan sangat senang.
Project Android Studio: DevBytesWorkManager.
- WorkManagerAPI memudahkan penjadwalan tugas-tugas asinkron yang dapat ditangguhkan dan harus berjalan tanpa masalah.
- Sebagian besar aplikasi dunia nyata perlu melakukan tugas latar belakang yang berjalan lama. Untuk menjadwalkan tugas latar belakang dengan cara yang optimal dan efisien, gunakan WorkManager.
- Class utama di library WorkManageradalahWorker,WorkRequest, danWorkManager.
- Class Workermewakili unit kerja. Untuk mengimplementasikan tugas latar belakang, perluas classWorkerdan ganti metodedoWork().
- Class WorkRequestmewakili permintaan untuk melakukan unit pekerjaan.WorkRequestadalah class dasar untuk menentukan parameter bagi tugas yang Anda jadwalkan diWorkManager.
- Ada dua implementasi konkret dari class WorkRequest:OneTimeWorkRequestuntuk tugas satu kali, danPeriodicWorkRequestuntuk permintaan pekerjaan berkala.
- Saat menentukan WorkRequest, Anda dapat menentukanConstraintsyang menunjukkan kapanWorkerharus dijalankan. Batasan mencakup hal-hal seperti apakah perangkat dicolokkan, apakah perangkat menganggur, atau apakah Wi-Fi terhubung.
- Untuk menambahkan batasan ke WorkRequest, gunakan metode set yang tercantum dalam dokumentasiConstraints.Builder. Misalnya, untuk menunjukkan bahwaWorkRequesttidak boleh berjalan jika baterai perangkat lemah, gunakan metode setsetRequiresBatteryNotLow().
- Setelah Anda menentukan WorkRequest, serahkan tugas ke sistem Android. Untuk melakukannya, jadwalkan tugas menggunakan salah satu metodeWorkManagerenqueue.
- Waktu pasti eksekusi Workerbergantung pada batasan yang digunakan dalamWorkRequest, dan pada pengoptimalan sistem.WorkManagerdirancang untuk memberikan perilaku terbaik dalam batasan ini.
Kursus Udacity:
Dokumentasi developer Android:
- Menentukan Permintaan Pekerjaan
- WorkManager
- Mulai menggunakan WorkManager
- Pekerjaan berulang
- Panduan pemrosesan background
Lainnya:
Bagian ini mencantumkan kemungkinan tugas pekerjaan rumah untuk siswa yang mengerjakan codelab ini sebagai bagian dari kursus yang dipimpin oleh instruktur. Instruktur menentukan hal berikut:
- Memberikan pekerjaan rumah jika diperlukan.
- Memberi tahu siswa cara mengirimkan tugas pekerjaan rumah.
- Memberi nilai tugas pekerjaan rumah.
Instruktur bisa menggunakan saran ini sesuai kebutuhan, dan bebas menugaskan pekerjaan rumah lain yang dirasa cocok.
Jika Anda menyelesaikan codelab ini sendiri, gunakan tugas pekerjaan rumah ini untuk menguji pengetahuan Anda.
Pertanyaan 1
Apa yang merupakan penerapan konkret class WorkRequest? 
▢ OneTimeWorkPeriodicRequest
▢ OneTimeWorkRequest dan PeriodicWorkRequest
▢ OneTimeWorkRequest dan RecurringWorkRequest
▢ OneTimeOffWorkRequest dan RecurringWorkRequest
Pertanyaan 2
Manakah dari class berikut yang digunakan WorkManager untuk menjadwalkan tugas latar belakang pada API 23 dan yang lebih baru? 
▢ Hanya JobScheduler
▢ BroadcastReceiver dan AlarmManager
▢ AlarmManager dan JobScheduler
▢ Scheduler dan BroadcastReceiver
Pertanyaan 3
API mana yang Anda gunakan untuk menambahkan batasan ke WorkRequest? 
▢ setConstraints()
▢ addConstraints()
▢ setConstraint()
▢ addConstraintsToWorkRequest()
Lanjutkan ke pelajaran berikutnya: 
Untuk link ke codelab lain dalam kursus ini, lihat halaman landing codelab Dasar-Dasar Android Kotlin.