Dokumen ini menjelaskan cara memigrasikan aplikasi agar menggunakan library klien WorkManager untuk melakukan operasi latar belakang, bukan library GCMNetworkManager. Cara yang lebih disukai agar aplikasi dapat menjadwalkan tugas latar belakang adalah menggunakan WorkManager. Dengan menyertakan library GCM WorkManager juga, Anda dapat mengaktifkan WorkManager untuk menggunakan GCM guna menjadwalkan tugas saat berjalan di perangkat Android yang menjalankan API level 22 atau yang lebih lama.
Bermigrasi ke WorkManager
Jika saat ini aplikasi Anda menggunakan GCMNetworkManager untuk melakukan operasi latar belakang, ikuti langkah-langkah ini untuk bermigrasi ke WorkManager.
Pada langkah ini, kami asumsikan Anda memulai dengan kode GCMNetworkManager berikut, yang menentukan dan menjadwalkan tugas:
Kotlin
val myTask = OneoffTask.Builder() // setService() says what class does the work .setService(MyUploadService::class.java) // Don't run the task unless device is charging .setRequiresCharging(true) // Run the task between 5 & 15 minutes from now .setExecutionWindow(5 * DateUtil.MINUTE_IN_SECONDS, 15 * DateUtil.MINUTE_IN_SECONDS) // Define a unique tag for the task .setTag("test-upload") // ...finally, build the task and assign its value to myTask .build() GcmNetworkManager.getInstance(this).schedule(myTask)
Java
// In GcmNetworkManager, this call defines the task and its // runtime constraints: OneoffTask myTask = new OneoffTask.Builder() // setService() says what class does the work .setService(MyUploadService.class) // Don't run the task unless device is charging .setRequiresCharging(true) // Run the task between 5 & 15 minutes from now .setExecutionWindow( 5 * DateUtil.MINUTE_IN_SECONDS, 15 * DateUtil.MINUTE_IN_SECONDS) // Define a unique tag for the task .setTag("test-upload") // ...finally, build the task and assign its value to myTask .build(); GcmNetworkManager.getInstance(this).schedule(myTask);
Pada contoh ini, kami asumsikan MyUploadService
mendefinisikan operasi upload yang sesungguhnya:
Kotlin
class MyUploadService : GcmTaskService() { fun onRunTask(params: TaskParams): Int { // Do some upload work return GcmNetworkManager.RESULT_SUCCESS } }
Java
class MyUploadService extends GcmTaskService { @Override public int onRunTask(TaskParams params) { // Do some upload work return GcmNetworkManager.RESULT_SUCCESS; } }
Menyertakan library WorkManager
Untuk menggunakan class WorkManager, Anda perlu menambahkan library WorkManager ke dependensi build. Anda juga perlu menambahkan library GCM WorkManager, yang memungkinkan WorkManager menggunakan GCM untuk penjadwalan tugas saat aplikasi Anda berjalan pada perangkat yang tidak mendukung JobScheduler (yaitu, perangkat yang menjalankan API level 22 atau yang lebih lama). Untuk mengetahui detail lengkap tentang menambahkan library, lihat Mulai Menggunakan WorkManager.
Mengubah manifes Anda
Setelah menerapkan GCMNetworkManager, Anda menambahkan instance GcmTaskService
ke manifes aplikasi, seperti yang dijelaskan dalam dokumentasi referensi GcmNetworkManager
. GcmTaskService
melihat tugas yang masuk dan mendelegasikannya ke pengendali tugas. WorkManager mengelola delegasi tugas untuk Worker, sehingga Anda tidak lagi membutuhkan class yang melakukan hal ini; cukup hapus GcmTaskService
dari manifes.
Menentukan Worker
Penerapan GCMNetworkManager Anda menentukan OneoffTask
atau RecurringTask
, yang menetapkan pekerjaan apa yang harus dilakukan. Anda perlu menulis ulang kode tersebut sebagai Worker
, seperti yang didokumentasikan dalam Menentukan permintaan pekerjaan Anda.
Contoh kode GCMNetworkManager mendefinisikan tugas myTask
. WorkManager yang setara terlihat seperti ini:
Kotlin
class UploadWorker(context: Context, params: WorkerParameters) : Worker(context, params) { override fun doWork() : Result { // Do the upload operation ... myUploadOperation() // Indicate whether the task finished successfully with the Result return Result.success() } }
Java
public class UploadWorker extends Worker { public UploadWorker( @NonNull Context context, @NonNull WorkerParameters params) { super(context, params); } @Override public Result doWork() { // Do the upload operation ... myUploadOperation() // Indicate whether the task finished successfully with the Result return Result.success() } }
Ada beberapa perbedaan antara tugas GCM dan Worker
:
- GCM menggunakan objek
TaskParams
untuk meneruskan parameter ke tugas.WorkManager
menggunakan data input, yang dapat Anda tentukan padaWorkRequest
, seperti yang dijelaskan dalam dokumentasiWorkManager
untuk Menentukan input/output untuk tugas Anda. Pada kedua kasus ini, Anda dapat meneruskan key-value pair yang mencantumkan parameter yang dapat dipertahankan apa pun yang diperlukan tugas. GcmTaskService
menandakan berhasil atau tidaknya dengan menampilkan flag sepertiGcmNetworkManager.RESULT_SUCCESS
.Worker
WorkManager menandai hasilnya menggunakan metodeListenableWorker.Result
sepertiListenableWorker.Result.success()
, dan menampilkan nilai pengembalian metode tersebut.- Seperti yang telah disebutkan, jangan menetapkan batasan atau tag saat menentukan
Worker
; sebagai gantinya, lakukan hal ini pada langkah berikutnya saat membuatWorkRequest
.
Menjadwalkan permintaan pekerjaan
Mendefinisikan Worker
akan menentukan apa yang perlu Anda lakukan. Untuk menentukan kapan pekerjaan harus dilakukan, Anda harus mendefinisikan WorkRequest
:
- Buat
OneTimeWorkRequest
atauPeriodicWorkRequest
, dan tetapkan batasan yang diinginkan yang menentukan kapan tugas harus dijalankan, serta tag untuk mengidentifikasi pekerjaan. - Teruskan permintaan ke
WorkManager.enqueue()
agar tugas diantrekan untuk dieksekusi.
Misalnya, bagian sebelumnya menunjukkan cara mengonversi OneoffTask
menjadi Worker
yang setara. Namun, Worker
tersebut tidak menyertakan tag dan batasan eksekusi objek OneoffTask
. Sebagai gantinya, kami tetapkan batasan dan ID tugas saat membuat WorkRequest
. Kami juga akan tentukan bahwa tugas tidak boleh berjalan kecuali ada koneksi jaringan. Anda tidak perlu secara eksplisit meminta koneksi jaringan pada GCMNetworkManager, karena GCMNetworkManager perlu koneksi jaringan secara default, tetapi WorkManager tidak perlu koneksi jaringan kecuali Anda secara khusus menambahkan batasan tersebut. Setelah mendefinisikan WorkRequest
, kami akan mengantrekannya dengan WorkManager.
Kotlin
val uploadConstraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .setRequiresCharging(true).build() val uploadTask = OneTimeWorkRequestBuilder<UploadWorker>() .setConstraints(uploadConstraints) .build() WorkManager.getInstance().enqueue(uploadTask)
Java
Constraints uploadConstraints = new Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .setRequiresCharging(true) .build(); OneTimeWorkRequest uploadTask = new OneTimeWorkRequest.Builder(UploadWorker.class) .setConstraints(uploadConstraints) .build(); WorkManager.getInstance().enqueue(uploadTask);
Pemetaan API
Bagian ini menjelaskan cara beberapa batasan dan fitur GCMNetworkManager dipetakan ke WorkManager yang setara.
Pemetaan batasan
GCMNetworkManager memungkinkan Anda menetapkan sejumlah batasan pada saat tugas Anda harus dijalankan. Biasanya, ada batasan WorkManager setara yang jelas. Bagian ini mencantumkan kesetaraan tersebut.
Tetapkan batasan pada tugas GCMNetworkManager dengan memanggil metode yang sesuai pada objek Builder tugas; misalnya, Anda dapat menetapkan persyaratan jaringan dengan memanggil Task.Builder.setRequiredNetwork()
.
Di WorkManager, Anda membuat objek Constraints.Builder
dan memanggil metode objek tersebut untuk menetapkan batasan misalnya, Constraints.Builder.setRequiredNetworkType())
, lalu menggunakan Builder untuk membuat objek Constraints yang dapat ditambahkan ke permintaan pekerjaan. Untuk informasi selengkapnya, lihat Menentukan permintaan pekerjaan Anda.
Batasan GCMNetworkManager | WorkManager yang setara | Notes |
---|---|---|
setPersisted() | (tidak wajib) | Semua tugas WorkManager dipertahankan saat reboot perangkat |
setRequiredNetwork() | setRequiredNetworkType() | Secara default, GCMNetworkManager perlu akses jaringan. Sedangkan, WorkManager tidak perlu akses jaringan. Jika tugas Anda perlu akses jaringan, Anda harus menggunakan setRequiredNetworkType(CONNECTED) , atau tentukan beberapa jenis jaringan yang lebih spesifik. |
setRequiresCharging() |
Pemetaan lainnya
Selain batasan, ada setelan lain yang dapat Anda terapkan ke tugas GCMNetworkManager. Bagian ini mencantumkan cara yang sesuai untuk menerapkan setelan tersebut ke tugas WorkManager.
Tag
Semua tugas GCMNetworkManager harus memiliki string tag, yang Anda tetapkan dengan memanggil metode setTag()
Builder. Tugas WorkManager diidentifikasi secara unik oleh ID, yang otomatis dibuat oleh WorkManager; Anda dapat memperoleh ID tersebut dengan memanggil WorkRequest.getId()
. Selain itu, permintaan pekerjaan dapat secara opsional memiliki satu atau beberapa tag. Untuk menetapkan tag bagi tugas WorkManager, panggil metode WorkRequest.Builder.addTag()
sebelum menggunakan Builder tersebut untuk membuat WorkRequest
.
Di GCMNetworkManager, Anda dapat memanggil setUpdateCurrent()
untuk menentukan apakah tugas harus mengganti tugas yang ada dengan tag yang sama. Pendekatan WorkManager yang setara adalah mengantrekan tugas dengan memanggil enqueueUniqueWork()
atau enqueueUniquePeriodicWork()
; jika menggunakan metode ini, berikan nama unik untuk tugas, dan juga tentukan cara WorkManager menangani permintaan jika sudah ada tugas yang tertunda dengan nama tersebut. Untuk informasi selengkapnya, lihat Menangani pekerjaan unik.
Parameter tugas
Anda dapat meneruskan parameter ke tugas GCMNetworkManager dengan memanggil Task.Builder.setExtras()
dan meneruskan Bundle
yang berisi parameter. WorkManager memungkinkan Anda meneruskan objek Data
ke tugas WorkManager, yang berisi parameter sebagai key-value pair. Untuk mengetahui detailnya, lihat Menetapkan data input.