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.