Bagikan melalui


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):

  1. 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.
  2. 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 bahwa JobService 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 jawab JobService untuk melakukan pekerjaan secara asinkron dan kembali true jika ada pekerjaan yang tersisa, atau false 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 jawab JobService untuk memberi tahu JobScheduler fakta ini dengan memanggil JobFinished metode (dijelaskan berikutnya).

  • JobFinished(Parameter JobParameters, bool needsReschedule) – Metode ini harus dipanggil oleh JobService untuk memberi tahu JobScheduler bahwa pekerjaan telah selesai. Jika JobFinished 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:

  1. Terapkan jenis JobService untuk merangkum pekerjaan.
  2. JobInfo.Builder Gunakan objek untuk membuat JobInfo objek yang akan menyimpan kriteria untuk JobScheduler menjalankan pekerjaan.
  3. 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:

  1. JobService Perluas kelas.
  2. Hiasi subkelas dengan ServiceAttribute dan atur Name parameter ke string yang terdiri dari nama paket dan nama kelas (lihat contoh berikut).
  3. Atur Permission properti pada ServiceAttribute ke string android.permission.BIND_JOB_SERVICE.
  4. 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.
  5. Ketika pekerjaan selesai, JobService harus memanggil JobFinished metode . Metode ini adalah bagaimana JobService memberi tahu JobScheduler pekerjaan itu dilakukan. Kegagalan panggilan JobFinished akan mengakibatkan JobService tuntutan yang tidak perlu pada perangkat, mempersingkat masa pakai baterai.
  6. Adalah ide yang baik untuk juga mengambil OnStopJob alih metode . Metode ini dipanggil oleh Android ketika pekerjaan sedang dimatikan sebelum selesai dan memberikan JobService kesempatan untuk membuang sumber daya apa pun dengan benar. Metode ini harus mengembalikan true jika perlu untuk menjadwalkan ulang pekerjaan, atau false 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 ke JobScheduler. Menggunakan kembali nilai ini akan memperbarui pekerjaan yang ada. Nilai harus unik untuk aplikasi.
  • JobService – parameter ini adalah ComponentName yang secara eksplisit mengidentifikasi jenis yang JobScheduler 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.