Penjadwal Pekerjaan Android
Panduan ini membahas cara menjadwalkan pekerjaan latar belakang menggunakan Android Job Scheduler API, yang tersedia di perangkat Android yang menjalankan Android 5.0 (API level 21) dan yang lebih tinggi.
Gambaran Umum
Salah satu cara terbaik untuk menjaga aplikasi Android tetap responsif kepada pengguna adalah dengan memastikan bahwa pekerjaan yang kompleks atau berjalan lama dilakukan di latar belakang. Namun, penting bahwa pekerjaan latar belakang tidak akan berdampak negatif pada pengalaman pengguna dengan perangkat.
Misalnya, pekerjaan latar belakang mungkin melakukan polling situs web setiap tiga atau empat menit untuk meminta perubahan pada himpunan data tertentu. Ini tampaknya jinak, namun akan berdampak buruk pada masa pakai baterai. Aplikasi akan berulang kali membangunkan perangkat, meningkatkan CPU ke status daya yang lebih tinggi, menyalakan radio, membuat permintaan jaringan, dan kemudian memproses hasilnya. Ini menjadi lebih buruk karena perangkat tidak akan segera mati dan kembali ke status menganggur berdaya rendah. Pekerjaan latar belakang yang dijadwalkan dengan buruk mungkin secara tidak sengaja menjaga perangkat dalam keadaan dengan persyaratan daya yang tidak perlu dan berlebihan. Aktivitas yang tampaknya tidak bersalah ini (polling situs web) akan membuat perangkat tidak dapat digunakan dalam waktu yang relatif singkat.
Android menyediakan API berikut untuk membantu melakukan pekerjaan di latar belakang tetapi dengan sendirinya mereka tidak cukup untuk penjadwalan pekerjaan cerdas.
- Layanan Niat – Layanan Niat sangat bagus untuk melakukan pekerjaan, namun mereka tidak menyediakan cara untuk menjadwalkan pekerjaan.
- AlarmManager – API ini hanya memungkinkan pekerjaan dijadwalkan tetapi tidak menyediakan cara untuk benar-benar melakukan pekerjaan. Selain itu, AlarmManager hanya memungkinkan batasan berbasis waktu, yang berarti menaikkan alarm pada waktu tertentu atau setelah periode waktu tertentu berlalu.
- Penerima Siaran – Aplikasi Android dapat menyiapkan penerima siaran untuk melakukan pekerjaan sebagai respons terhadap peristiwa atau Niat di seluruh sistem. Namun, penerima siaran tidak memberikan kontrol apa pun atas kapan pekerjaan harus dijalankan. Juga perubahan dalam sistem operasi Android akan membatasi kapan penerima siaran akan berfungsi, atau jenis pekerjaan yang dapat mereka tanggapi.
Ada dua fitur utama untuk melakukan pekerjaan latar belakang secara efisien (kadang-kadang disebut sebagai pekerjaan latar belakang atau pekerjaan):
- Menjadwalkan pekerjaan dengan cerdas - Penting bahwa ketika aplikasi melakukan pekerjaan di latar belakang bahwa itu melakukannya sebagai warga negara yang baik. Idealnya, aplikasi tidak boleh menuntut agar pekerjaan dijalankan. Sebagai gantinya, aplikasi harus menentukan kondisi yang harus dipenuhi ketika pekerjaan dapat berjalan, dan kemudian menjadwalkan pekerjaan tersebut dengan sistem operasi yang akan melakukan pekerjaan ketika kondisi terpenuhi. Hal ini memungkinkan Android menjalankan pekerjaan untuk memastikan efisiensi maksimum pada perangkat. Misalnya, permintaan jaringan dapat di-batch untuk menjalankan semua pada saat yang sama untuk memanfaatkan overhead maksimum yang terlibat dengan jaringan.
- Merangkum pekerjaan - Kode untuk melakukan pekerjaan latar belakang harus dienkapsulasi dalam komponen diskrit yang dapat dijalankan secara independen dari antarmuka pengguna dan akan relatif mudah untuk dijadwalkan ulang jika pekerjaan gagal diselesaikan karena beberapa alasan.
Android Job Scheduler adalah kerangka kerja bawaan sistem operasi Android yang menyediakan API fasih untuk menyederhanakan pekerjaan latar belakang penjadwalan. Android Job Scheduler terdiri dari jenis berikut:
Android.App.Job.JobScheduler
adalah layanan sistem yang digunakan untuk menjadwalkan, menjalankan, dan jika perlu membatalkan, pekerjaan atas nama aplikasi Android.- adalah
Android.App.Job.JobService
kelas abstrak yang harus diperpanjang dengan logika yang akan menjalankan pekerjaan pada utas utama aplikasi. Ini berarti bahwaJobService
bertanggung jawab atas bagaimana pekerjaan akan dilakukan secara asinkron. - Objek
Android.App.Job.JobInfo
menyimpan kriteria untuk memandu Android saat pekerjaan harus berjalan.
Untuk menjadwalkan pekerjaan dengan Android Job Scheduler, aplikasi Xamarin.Android harus merangkum kode di kelas yang memperluas JobService
kelas. JobService
memiliki tiga metode siklus hidup yang dapat dipanggil selama masa pakai pekerjaan:
bool OnStartJob(Parameter JobParameters) – Metode ini dipanggil oleh
JobScheduler
untuk melakukan pekerjaan, dan berjalan pada utas utama aplikasi. Ini adalah tanggung jawabJobService
untuk melakukan pekerjaan secara asinkron dan kembalitrue
jika ada pekerjaan yang tersisa, ataufalse
jika pekerjaan dilakukan.JobScheduler
Ketika memanggil metode ini, metode ini akan meminta dan mempertahankan wakelock dari Android selama durasi pekerjaan. Ketika pekerjaan selesai, adalah tanggung jawabJobService
untuk memberi tahuJobScheduler
fakta ini dengan memanggilJobFinished
metode (dijelaskan berikutnya).JobFinished(Parameter JobParameters, bool needsReschedule) – Metode ini harus dipanggil oleh
JobService
untuk memberi tahuJobScheduler
bahwa pekerjaan telah selesai. JikaJobFinished
tidak dipanggil,JobScheduler
tidak akan melepas wakelock, menyebabkan pengurasan baterai yang tidak perlu.bool OnStopJob(Parameter JobParameters) - Ini dipanggil ketika pekerjaan dihentikan sebelum waktunya oleh Android. Ini harus mengembalikan
true
jika pekerjaan harus dijadwalkan ulang berdasarkan kriteria percobaan kembali (dibahas di bawah ini secara lebih rinci).
Dimungkinkan untuk menentukan batasan atau pemicu yang akan mengontrol kapan pekerjaan dapat atau harus berjalan. Misalnya, dimungkinkan untuk membatasi pekerjaan sehingga hanya akan berjalan ketika perangkat mengisi daya atau untuk memulai pekerjaan ketika gambar diambil.
Panduan ini akan membahas secara rinci cara menerapkan JobService
kelas dan menjadwalkannya dengan JobScheduler
.
Persyaratan
Android Job Scheduler memerlukan Android API level 21 (Android 5.0) atau yang lebih tinggi.
Menggunakan Android Job Scheduler
Ada tiga langkah untuk menggunakan Android JobScheduler API:
- Terapkan jenis JobService untuk merangkum pekerjaan.
JobInfo.Builder
Gunakan objek untuk membuatJobInfo
objek yang akan menyimpan kriteria untukJobScheduler
menjalankan pekerjaan.- Jadwalkan pekerjaan menggunakan
JobScheduler.Schedule
.
Menerapkan JobService
Semua pekerjaan yang dilakukan oleh pustaka Android Job Scheduler harus dilakukan dalam jenis yang memperluas Android.App.Job.JobService
kelas abstrak. JobService
Membuat sangat mirip dengan membuat Service
dengan kerangka kerja Android:
JobService
Perluas kelas.- Hiasi subkelas dengan
ServiceAttribute
dan aturName
parameter ke string yang terdiri dari nama paket dan nama kelas (lihat contoh berikut). - Atur
Permission
properti padaServiceAttribute
ke stringandroid.permission.BIND_JOB_SERVICE
. - Ambil alih
OnStartJob
metode , menambahkan kode untuk melakukan pekerjaan. Android akan memanggil metode ini pada utas utama aplikasi untuk menjalankan pekerjaan. Pekerjaan yang akan memakan waktu lebih lama sehingga beberapa milidetik harus dilakukan pada utas untuk menghindari pemblokiran aplikasi. - Ketika pekerjaan selesai,
JobService
harus memanggilJobFinished
metode . Metode ini adalah bagaimanaJobService
memberi tahuJobScheduler
pekerjaan itu dilakukan. Kegagalan panggilanJobFinished
akan mengakibatkanJobService
tuntutan yang tidak perlu pada perangkat, mempersingkat masa pakai baterai. - Adalah ide yang baik untuk juga mengambil
OnStopJob
alih metode . Metode ini dipanggil oleh Android ketika pekerjaan sedang dimatikan sebelum selesai dan memberikanJobService
kesempatan untuk membuang sumber daya apa pun dengan benar. Metode ini harus mengembalikantrue
jika perlu untuk menjadwalkan ulang pekerjaan, ataufalse
jika tidak diinginkan untuk menjalankan kembali pekerjaan.
Kode berikut adalah contoh yang paling JobService
sederhana untuk aplikasi, menggunakan TPL untuk melakukan beberapa pekerjaan secara asinkron:
[Service(Name = "com.xamarin.samples.downloadscheduler.DownloadJob",
Permission = "android.permission.BIND_JOB_SERVICE")]
public class DownloadJob : JobService
{
public override bool OnStartJob(JobParameters jobParams)
{
Task.Run(() =>
{
// Work is happening asynchronously
// Have to tell the JobScheduler the work is done.
JobFinished(jobParams, false);
});
// Return true because of the asynchronous work
return true;
}
public override bool OnStopJob(JobParameters jobParams)
{
// we don't want to reschedule the job if it is stopped or cancelled.
return false;
}
}
Membuat JobInfo untuk menjadwalkan pekerjaan
Aplikasi Xamarin.Android tidak membuat instans secara JobService
langsung, sebaliknya mereka akan meneruskan JobInfo
objek ke JobScheduler
. JobScheduler
akan membuat instans objek yang JobService
diminta, menjadwalkan dan menjalankan JobService
sesuai dengan metadata di JobInfo
. Objek JobInfo
harus berisi informasi berikut:
- JobId - ini adalah
int
nilai yang digunakan untuk mengidentifikasi pekerjaan keJobScheduler
. Menggunakan kembali nilai ini akan memperbarui pekerjaan yang ada. Nilai harus unik untuk aplikasi. - JobService – parameter ini adalah
ComponentName
yang secara eksplisit mengidentifikasi jenis yangJobScheduler
harus digunakan untuk menjalankan pekerjaan.
Metode ekstensi ini menunjukkan cara membuat JobInfo.Builder
dengan Android Context
, seperti Aktivitas:
public static class JobSchedulerHelpers
{
public static JobInfo.Builder CreateJobBuilderUsingJobId<T>(this Context context, int jobId) where T:JobService
{
var javaClass = Java.Lang.Class.FromType(typeof(T));
var componentName = new ComponentName(context, javaClass);
return new JobInfo.Builder(jobId, componentName);
}
}
// Sample usage - creates a JobBuilder for a DownloadJob and sets the Job ID to 1.
var jobBuilder = this.CreateJobBuilderUsingJobId<DownloadJob>(1);
var jobInfo = jobBuilder.Build(); // creates a JobInfo object.
Fitur canggih dari Android Job Scheduler adalah kemampuan untuk mengontrol kapan pekerjaan berjalan atau dalam kondisi apa pekerjaan dapat berjalan. Tabel berikut menjelaskan beberapa metode yang JobInfo.Builder
memungkinkan aplikasi memengaruhi kapan pekerjaan dapat berjalan:
Metode | Deskripsi |
---|---|
SetMinimumLatency |
Menentukan bahwa penundaan (dalam milidetik) yang harus diamati sebelum pekerjaan dijalankan. |
SetOverridingDeadline |
Menyatakan bahwa pekerjaan harus berjalan sebelum waktu ini (dalam milidetik) telah berlalu. |
SetRequiredNetworkType |
Menentukan persyaratan jaringan untuk pekerjaan. |
SetRequiresBatteryNotLow |
Pekerjaan hanya dapat berjalan ketika perangkat tidak menampilkan peringatan "baterai rendah" kepada pengguna. |
SetRequiresCharging |
Pekerjaan hanya dapat berjalan ketika baterai sedang diisi dayanya. |
SetDeviceIdle |
Pekerjaan akan berjalan ketika perangkat sibuk. |
SetPeriodic |
Menentukan bahwa pekerjaan harus dijalankan secara teratur. |
SetPersisted |
Pekerjaan harus perisist di seluruh reboot perangkat. |
memberikan SetBackoffCriteria
beberapa panduan tentang berapa lama JobScheduler
harus menunggu sebelum mencoba menjalankan pekerjaan lagi. Ada dua bagian untuk kriteria backoff: penundaan dalam milidetik (nilai default 30 detik)dan jenis back off yang harus digunakan (kadang-kadang disebut sebagai kebijakan backoff atau kebijakan coba lagi). Kedua kebijakan dienkapsulasi dalam Android.App.Job.BackoffPolicy
enum:
BackoffPolicy.Exponential
– Kebijakan backoff eksponensial akan meningkatkan nilai backoff awal secara eksponensial setelah setiap kegagalan. Pertama kali pekerjaan gagal, pustaka akan menunggu interval awal yang ditentukan sebelum menjadwalkan ulang pekerjaan – contoh 30 detik. Kedua kalinya pekerjaan gagal, pustaka akan menunggu setidaknya 60 detik sebelum mencoba menjalankan pekerjaan. Setelah upaya ketiga gagal, pustaka akan menunggu 120 detik, dan sebagainya. Ini adalah nilai default.BackoffPolicy.Linear
– Strategi ini adalah backoff linier yang harus dijadwalkan ulang untuk dijalankan pada interval yang ditetapkan (sampai berhasil). Backoff linier paling cocok untuk pekerjaan yang harus diselesaikan sesegera mungkin atau untuk masalah yang akan dengan cepat menyelesaikan sendiri.
Untuk detail selengkapnya tentang membuat JobInfo
objek, baca dokumentasi Google untuk kelas tersebutJobInfo.Builder
.
Meneruskan parameter ke pekerjaan melalui JobInfo
Parameter diteruskan ke pekerjaan dengan membuat PersistableBundle
yang diteruskan bersama dengan Job.Builder.SetExtras
metode :
var jobParameters = new PersistableBundle();
jobParameters.PutInt("LoopCount", 11);
var jobBuilder = this.CreateJobBuilderUsingJobId<DownloadJob>(1)
.SetExtras(jobParameters)
.Build();
PersistableBundle
diakses dari Android.App.Job.JobParameters.Extras
properti dalam OnStartJob
metode JobService
:
public override bool OnStartJob(JobParameters jobParameters)
{
var loopCount = jobParams.Extras.GetInt("LoopCount", 10);
// rest of code omitted
}
Menjadwalkan pekerjaan
Untuk menjadwalkan pekerjaan, aplikasi Xamarin.Android akan mendapatkan referensi ke JobScheduler
layanan sistem dan memanggil JobScheduler.Schedule
metode dengan JobInfo
objek yang dibuat pada langkah sebelumnya. JobScheduler.Schedule
akan segera kembali dengan salah satu dari dua nilai bilangan bulat:
- JobScheduler.ResultSuccess – Pekerjaan telah berhasil dijadwalkan.
- JobScheduler.ResultFailure – Pekerjaan tidak dapat dijadwalkan. Ini biasanya disebabkan oleh parameter yang bertentangan
JobInfo
.
Kode ini adalah contoh penjadwalan pekerjaan dan memberi tahu pengguna tentang hasil upaya penjadwalan:
var jobScheduler = (JobScheduler)GetSystemService(JobSchedulerService);
var scheduleResult = jobScheduler.Schedule(jobInfo);
if (JobScheduler.ResultSuccess == scheduleResult)
{
var snackBar = Snackbar.Make(FindViewById(Android.Resource.Id.Content), Resource.String.jobscheduled_success, Snackbar.LengthShort);
snackBar.Show();
}
else
{
var snackBar = Snackbar.Make(FindViewById(Android.Resource.Id.Content), Resource.String.jobscheduled_failure, Snackbar.LengthShort);
snackBar.Show();
}
Membatalkan pekerjaan
Dimungkinkan untuk membatalkan semua pekerjaan yang telah dijadwalkan, atau hanya satu pekerjaan menggunakan JobsScheduler.CancelAll()
metode atau JobScheduler.Cancel(jobId)
metode :
// Cancel all jobs
jobScheduler.CancelAll();
// to cancel a job with jobID = 1
jobScheduler.Cancel(1)
Ringkasan
Panduan ini membahas cara menggunakan Android Job Scheduler untuk melakukan pekerjaan dengan cerdas di latar belakang. Ini membahas cara merangkum pekerjaan yang akan dilakukan sebagai JobService
dan cara menggunakan JobScheduler
untuk menjadwalkan pekerjaan tersebut, menentukan kriteria dengan JobTrigger
dan bagaimana kegagalan harus ditangani dengan RetryStrategy
.