Android İş Zamanlayıcısı

Bu kılavuzda, Android 5,0 (API Düzey 21) ve üzeri çalıştıran Android cihazlarda bulunan Android Iş Zamanlayıcı API 'SI kullanılarak arka plan işinin nasıl zamanlandığı açıklanmaktadır.

Genel Bakış

Android uygulamasını kullanıcıya yanıt verecek şekilde tutmanın en iyi yöntemlerinden biri, karmaşık veya uzun süre çalışan çalışmanın arka planda gerçekleştirilmesini sağlamaktır. Ancak arka plan işinin, kullanıcının cihazla olan deneyimini olumsuz şekilde etkilememesi önemlidir.

Örneğin, bir arka plan işi belirli bir veri kümesindeki değişiklikleri sorgulamak için her üç veya dört dakikada bir Web sitesini yoklamayı gerektirebilir. Bu, zararsız gibi görünse de, pil ömrü üzerinde felaket bir etkiye sahip olabilir. Uygulama, arka arkaya cihazı uyandırır, CPU 'YU daha yüksek bir güç durumuna yükseltirse, radyoların gücünü kapatıp, ağ isteklerini yapıp sonuçları işleyerek sonuçları işleyecektir. Cihaz hemen kapanmayacağı ve düşük güç boşta durumuna döndürülmediği için bu daha kötüleşiyor. Kötü zamanlı zamanlanmış arka plan çalışması yanlışlıkla cihazı gereksiz ve aşırı güç gereksinimlerine sahip bir durumda tutar. Bu ımasum etkinliği (bir Web sitesini yoklamak), cihazı görece kısa bir süre içinde kullanılamaz hale getirecek.

Android, arka planda iş gerçekleştirmeye yardımcı olmak için aşağıdaki API 'Leri sağlar, ancak kendi kendilerine akıllı iş zamanlaması için yeterli değildir.

  • Amaç Hizmetleri – amaç gerçekleştirmek Için harika hizmetler, ancak iş zamanlamak için bir yol sağlar.
  • Alarmmanager : Bu API 'ler yalnızca çalışmanın zamanlanmasını sağlar ancak çalışmayı gerçekten gerçekleştirmek için bir yol sağlar. Ayrıca, AlarmManager yalnızca zamana dayalı kısıtlamalara izin verir. Bu, belirli bir süre içinde veya belirli bir süre geçtikten sonra alarm tetiklemedir.
  • Yayın alıcıları – bir Android uygulaması, sistem genelinde olaylara veya amaçlar için yanıt olarak iş gerçekleştirmek üzere yayın alıcılarını ayarlayabilir. Ancak, yayın alıcıları iş çalıştırılması gerektiğinde herhangi bir denetim sağlamaz. Ayrıca, Android işletim sistemindeki değişiklikler yayın alıcılarının ne zaman çalışabileceğini veya yanıt verebilecekleri iş türlerini kısıtlar.

Arka plan çalışmasını verimli bir şekilde gerçekleştirmek için iki temel özellik vardır (bazen bir arka plan işi veya olarak adlandırılır):

  1. İşi akıllıca zamanlamaya göre, bir uygulama arka planda çalışırken iyi bir vatandaşlık olarak yaptığı durumlarda önemlidir. İdeal olarak, uygulama bir işin çalıştırılacağını talep etmez. Bunun yerine, uygulama, iş çalışabileceği zaman için karşılanması gereken koşulları belirtmelidir ve ardından bu işi, koşullar karşılandığında işi gerçekleştirecek işletim sistemiyle zamanlayabilir. Bu, Android 'in cihazda en yüksek verimliliği sağlamak üzere işi çalıştırmasına olanak tanır. Örneğin, ağ istekleri, ağ ile ilgili ek yükün en fazla kullanımını sağlamak için aynı anda tümünü çalıştıracak şekilde toplanmış olabilir.
  2. Işi kapsülleme : arka plan işini gerçekleştirmeye yönelik kod, kullanıcı arabiriminden bağımsız bir şekilde çalıştırılabilen ayrı bir bileşende kapsüllenmelidir ve bir nedenden dolayı iş tamamlanamazsa daha kolay bir şekilde yeniden zamanlayabilirsiniz.

Android Iş Zamanlayıcısı, arka plan işinin zamanlanmasını kolaylaştırmak için bir Fluent API sağlayan Android işletim sistemine yerleşik bir çerçevedir. Android Iş Zamanlayıcısı aşağıdaki türlerden oluşur:

  • , Android.App.Job.JobScheduler Bir Android uygulaması adına işleri zamanlamak, yürütmek ve gerekirse iptal etmek için kullanılan bir sistem hizmetidir.
  • , Android.App.Job.JobService Uygulamanın ana iş parçacığında işi çalıştıracak mantığı ile genişletilmesi gereken soyut bir sınıftır. Bu, JobService işin zaman uyumsuz olarak gerçekleştirilmesinden sorumludur.
  • Bir Android.App.Job.JobInfo nesne, iş çalıştırıldığında Android 'e kılavuzluk eden kriterleri tutar.

Android Iş Zamanlayıcısı ile iş zamanlamak için bir Xamarin. Android uygulaması, kodu sınıfını genişleten bir sınıfta kapsületmelidir JobService . JobService İşin ömrü boyunca çağrılabilecek üç yaşam döngüsü yöntemine sahiptir:

  • bool OnStartJob (jobparameters parametreleri) – bu yöntem tarafından iş gerçekleştirmek için çağrılır ve uygulamanın ana iş parçacığında çalışır. JobServiceİş için zaman uyumsuz olarak çalışmayı gerçekleştirme ve true kalan iş varsa veya iş yapıla, geri dönme için sorumluluğun sorumluluğundadır false .

    JobSchedulerBu yöntemi çağırdığında, iş süresince Android 'den bir wakelock ister ve bu işlemi korur. İş bittiğinde, JobServiceJobScheduler yöntemi çağırarak bu olguyu bildirmek için ' nin sorumluluğundadır JobFinished .

  • Jobfinished (JobParameters parametreleri, bool gereksiz sYeniden Çizelgele) – bu yöntemin, işin yapıldığını bildirmek için tarafından çağrılması gerekir JobScheduler . JobFinishedÇağrılmadığından, JobScheduler wakelock kaldırmaz ve gereksiz pil boşaltmasına neden olur.

  • bool OnStopJob (jobparameters parametreleri) – bu, iş Android tarafından erken durdurulduğu zaman çağrılır. trueİş yeniden deneme ölçütlerine göre yeniden zamanlanırsa (daha ayrıntılı bilgi için aşağıda açıklanmıştır) döndürmelidir.

Bir işin ne zaman çalıştırılacağını kontrol edecek kısıtlamalar veya Tetikleyiciler belirtmek mümkündür. Örneğin, bir işi yalnızca cihaz şarj edildiğinde veya bir resim çekilirken bir işi başlatırken çalışacak şekilde kısıtlamak mümkündür.

Bu kılavuz, bir sınıfı nasıl uygulayacağınızı ve ile zamanlamayı ayrıntılı olarak tartışacaktır JobServiceJobScheduler .

Gereksinimler

Android Iş Zamanlayıcı, Android API düzeyi 21 (Android 5,0) veya üstünü gerektirir.

Android Iş zamanlayıcısını kullanma

Android JobScheduler API 'SI kullanmanın üç adımı vardır:

  1. İşi kapsüllemek için bir JobService türü uygulayın.
  2. JobInfo.BuilderJobInfo İşi çalıştırmak için ölçütlerini tutacak nesneyi oluşturmak için bir nesnesi kullanın JobScheduler .
  3. İşi kullanarak zamanlayın JobScheduler.Schedule .

Bir JobService uygulama

Android Iş Zamanlayıcısı kitaplığı tarafından gerçekleştirilen tüm işler, soyut sınıfı genişleten bir tür içinde yapılmalıdır Android.App.Job.JobService . Oluşturma JobServiceService , Android Framework ile oluşturmak için çok benzerdir:

  1. Sınıfı genişletin JobService .
  2. Alt sınıfını ile ServiceAttributeName süsleyip parametresini paket adından ve sınıfın adından oluşan bir dizeye ayarlayın (aşağıdaki örneğe bakın).
  3. PermissionÜzerinde özelliğini ServiceAttribute dizeye ayarlayın android.permission.BIND_JOB_SERVICE .
  4. OnStartJobYöntemi, çalışmayı gerçekleştirmek için kodu ekleyerek geçersiz kılın. Android, işi çalıştırmak için uygulamanın ana iş parçacığında bu yöntemi çağıracaktır. Uygulamanın engellenmesini önlemek için bir iş parçacığında birkaç milisaniye gerçekleştirilmesi daha uzun sürer.
  5. İş tamamlandığında, JobServiceJobFinished yöntemini çağırmalıdır. Bu yöntem, bu JobService çalışmanın nasıl JobScheduler yapıldığını söyler. Çağrı hatası, JobFinished cihaza gereksiz talepler koymaya neden olur ve bu da JobService pil ömrünü kısaltır.
  6. Ayrıca yöntemi geçersiz kılmak iyi bir fikirdir OnStopJob . Bu yöntem, iş tamamlanmadan önce kapatıldığında Android tarafından çağrılır ve JobService tüm kaynakları düzgün bir şekilde atmak için bir fırsat sağlar. Bu yöntem, true işi yeniden zamanlamak için gerekliyse veya false işi yeniden çalıştırmak istenmediğinde döndürmelidir.

Aşağıdaki kod, bir uygulamanın en basit örneğine bir örnektir ve bu, JobService zaman uyumsuz olarak bir iş yürütmek IÇIN tpl kullanarak:

[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; 
    }
}

İş zamanlamak için Jobınfo oluşturma

Xamarin. Android uygulamaları doğrudan bir örneğini içermez JobService , bunun yerine öğesine bir nesnesi iletir JobInfoJobScheduler . , JobScheduler İstenen nesneyi örneklendirilecek JobService ve JobService içindeki meta verilere göre ' yi planlıyor ve çalıştıracaktır JobInfo . Bir JobInfo nesne aşağıdaki bilgileri içermelidir:

  • JobId : Bu bir işi tanımlamak için kullanılan bir değerdir JobScheduler . Bu değeri yeniden kullanmak, var olan işleri güncelleştirecek. Değer, uygulama için benzersiz olmalıdır.
  • Jobservice – Bu parametre , JobScheduler bir işi çalıştırmak için kullanması gereken türü açıkça tanımlayan bir türüdür.

Bu genişletme yöntemi JobInfo.Builder , bir etkinlik gibi Android ile nasıl oluşturulacağını gösterir Context :

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.

Android Iş zamanlayıcısının güçlü bir özelliği, bir işin ne zaman çalışacağını veya bir işin hangi koşullarda çalıştırılacağını denetleyebilmesidir. Aşağıdaki tabloda, JobInfo.Builder bir işin çalışması sırasında uygulamanın etkilemesini sağlayan bazı yöntemler açıklanmaktadır:

Yöntem Açıklama
SetMinimumLatency Bir iş çalıştırılmadan önce gözlenecek bir gecikme (milisaniye olarak) belirtir.
SetOverridingDeadline İşin bu süreden (milisaniye olarak) önce çalıştırılması gereken süreyi bildirir.
SetRequiredNetworkType Bir iş için ağ gereksinimlerini belirtir.
SetRequiresBatteryNotLow İş yalnızca, cihazda kullanıcıya bir "düşük pil" uyarısı görüntülememe durumunda çalıştırılabilir.
SetRequiresCharging İş yalnızca pil şarj edildiğinde çalıştırılabilir.
SetDeviceIdle Cihaz meşgul olduğunda iş çalışacaktır.
SetPeriodic İşin düzenli olarak çalıştırılması gerektiğini belirtir.
SetPersisted İş, cihaz yeniden başlatmaları arasında perisist.

, SetBackoffCriteriaJobScheduler Bir işi yeniden çalıştırmayı denemeden önce ne kadar süre beklemesi gerektiğini gösteren bir kılavuz sağlar. Geri alma ölçütlerinde iki bölüm vardır: milisaniye cinsinden gecikme süresi (varsayılan değer olan 30 saniye) ve kullanılması gereken (bazen geri alma ilkesi veya yeniden deneme ilkesiolarak da adlandırılır) türü. Numaralamada iki ilke kapsüllenir Android.App.Job.BackoffPolicy :

  • BackoffPolicy.Exponential – Bir üstel geri alma ilkesi, her hatadan sonra ilk geri alma değerini üstel olarak artırır. Bir iş ilk kez başarısız olursa, kitaplık, iş yeniden başlatılmadan önce belirtilen ilk aralığı bekler-örnek 30 saniye olur. İşin ikinci zamanı başarısız olursa, kitaplık, işi çalıştırmayı denemeden önce en az 60 saniye bekler. Üçüncü başarısız girişimden sonra, kitaplık 120 saniye bekler ve bu şekilde devam eder. Varsayılan değer budur.
  • BackoffPolicy.Linear – Bu strateji, işin ayarlanan aralıklarla (tamamlanana kadar) çalıştırılması için yeniden zamanlanmasını gerektiren doğrusal bir geri alma işlemi. Doğrusal geri alma, en kısa sürede veya kendilerini hızlı bir şekilde çözümleyecek sorunlar için en uygun çalışmalardır.

Nesne oluşturma hakkında daha fazla bilgi için JobInfo lütfen JobInfookuyun.

Jobınfo aracılığıyla bir işe parametre geçirme

Parametreleri PersistableBundle , yöntemiyle birlikte geçirilmiş bir oluşturarak bir işe geçirilir Job.Builder.SetExtras :

var jobParameters = new PersistableBundle();
jobParameters.PutInt("LoopCount", 11);

var jobBuilder = this.CreateJobBuilderUsingJobId<DownloadJob>(1)
                     .SetExtras(jobParameters)
                     .Build();

, PersistableBundleAndroid.App.Job.JobParameters.ExtrasOnStartJob Bir a yöntemi içindeki özelliğinden erişilir JobService :

public override bool OnStartJob(JobParameters jobParameters)
{
    var loopCount = jobParams.Extras.GetInt("LoopCount", 10);
    
    // rest of code omitted
} 

İş zamanlama

Bir iş zamanlamak için, bir Xamarin. Android uygulaması, sistem hizmetine bir başvuru alır JobScheduler ve JobScheduler.ScheduleJobInfo önceki adımda oluşturulan nesneyle yöntemi çağırır. JobScheduler.Schedule , hemen iki tamsayı değerinden biriyle döndürülür:

  • Jobscheduler. ResultSuccess – iş başarıyla zamanlandı.
  • Jobscheduler. ResultFailure – iş zamanlanamaz. Bunun nedeni genellikle çakışan JobInfo parametrelerdir.

Bu kod, bir işi zamanlamaya ve kullanıcıya zamanlama denemesinin sonuçlarını bildirmeye yönelik bir örnektir:

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();
}

Bir işi iptal etme

Zamanlanan tüm işleri ya da yöntemini veya yöntemini kullanarak yalnızca tek bir işi iptal etmek mümkündür JobsScheduler.CancelAll()JobScheduler.Cancel(jobId) :

// Cancel all jobs
jobScheduler.CancelAll(); 

// to cancel a job with jobID = 1
jobScheduler.Cancel(1)

Özet

Bu kılavuzda, arka planda iş yapmak için Android Iş Scheduler ' ın nasıl kullanılacağı ele alınmaktadır. Bir olarak gerçekleştirilecek işi kapsüllemek JobService ve bu işi zamanlamak için ' nin nasıl kullanılacağı ele alınmıştır ve JobScheduler ile kriterleri JobTrigger ve hataların bir ile nasıl ele alınacağını belirtin RetryStrategy .