Folosind API-ul JobScheduler pe Android Lollipop

În acest tutorial, veți învăța cum să utilizați JobScheduler API disponibil în Android Lollipop. JobScheduler API permite dezvoltatorilor să creeze sarcini care se execută în fundal atunci când sunt îndeplinite anumite condiții.

Introducere

Când lucrați cu Android, vor exista ocazii în care veți dori să executați o sarcină într-un moment ulterior sau în anumite condiții, cum ar fi atunci când un dispozitiv este conectat la o sursă de alimentare sau conectat la o rețea Wi-Fi. Din fericire cu API 21, cunoscut de majoritatea oamenilor ca Android Lollipop, Google a oferit o nouă componentă cunoscută sub numele de JobScheduler API pentru a face față acestui scenariu.

JobScheduler API efectuează o operațiune pentru aplicația dvs. atunci când sunt îndeplinite un set de condiții predefinite. spre deosebire de AlarmManager clasa, calendarul nu este exact. In plus JobScheduler API este capabil să împacheteze diferite locuri de muncă pentru a rula împreună. Acest lucru permite aplicației dvs. să efectueze sarcina dată în timp ce este atenți la bateria dispozitivului, cu prețul controlului de sincronizare.

În acest articol, veți afla mai multe despre JobScheduler API și JobService clasă, utilizându-le pentru a rula o sarcină de fundal simplă într-o aplicație Android. Codul pentru acest tutorial este disponibil pe GitHub.

1. Crearea serviciului de locuri de muncă

Pentru a începe, veți dori să creați un nou proiect Android cu un minim API necesar de 21, deoarece JobScheduler API-ul a fost adăugat în versiunea cea mai recentă de Android și, la momentul redactării, nu este compatibil înapoi printr-o bibliotecă de suport.

Presupunând că utilizați Android Studio, după ce ați atins butonul finalizat pentru noul proiect, trebuie să aveți o aplicație "Hello World" cu oase goale. Primul pas pe care îl veți lua cu acest proiect este crearea unei noi clase Java. Pentru a păstra lucrurile simple, să le menționăm JobSchedulerService și de a extinde JobService clasa, care necesită crearea a două metode onStartJob (JobParameters params) și onStopJob (parola JobParameters).

clasa publică JobSchedulerService extinde JobService @Override public boolean onStartJob (JobParameters params) return false;  @Override public boolean onStopJob (JobParameters params) return false; 

onStartJob (JobParameters params) este metoda pe care trebuie să o utilizați atunci când începeți sarcina dvs., deoarece este ceea ce sistemul utilizează pentru a declanșa lucrări care au fost deja programate. După cum puteți vedea, metoda returnează o valoare booleană. Dacă valoarea de retur este fals, sistemul presupune că orice sarcină a funcționat nu a durat mult și se face până la revenirea metodei. Dacă valoarea de retur este Adevărat, atunci sistemul presupune că sarcina va dura ceva timp și sarcina revine asupra dvs., dezvoltatorului, de a spune sistemului când sarcina dată este completă prin apelare jobFinished (JobParameters params, boolean needsRescheduled).

onStopJob (parola JobParameters) este utilizat de sistem pentru a anula sarcinile în așteptare atunci când este primită o cerere de anulare. Este important să rețineți că dacă onStartJob (JobParameters params) se intoarce fals, sistemul presupune că nu există lucrări care să fie difuzate în momentul în care este primită o cerere de anulare. Cu alte cuvinte, pur și simplu nu va suna onStopJob (parola JobParameters).

Un lucru de remarcat este că serviciul de serviciu rulează pe firul principal al aplicației. Asta înseamnă că tu trebuie să utilizați un alt fir, un handler sau o sarcină asincronă pentru a rula sarcini mai lungi pentru a nu bloca firul principal. Deoarece tehnicile multithreading sunt dincolo de sfera de aplicare a acestui tutorial, să-l păstram simplu și să punem în aplicare un handler pentru a ne conduce sarcina în JobSchedulerService clasă.

(=) () () () () () () () () MessageType (getApplicationContext JobParameters) msg.obj, false); return true;);

În handler, implementați handleMessage (Mesaj mesaj) metoda din care face parte manipulant instanță și l-ați executa logica sarcinii. În acest caz, vom păstra lucrurile foarte simple și vom posta Paine prajita mesaj de la aplicație, deși aici vă veți pune logica pentru lucruri cum ar fi sincronizarea datelor.

Când se încheie sarcina, trebuie să apelați jobFinished (JobParameters params, boolean needsRescheduled) pentru a lăsa sistemul să știe că ați terminat cu această sarcină și că poate începe să aștepte operația următoare. Dacă nu faceți acest lucru, lucrările dvs. vor fi difuzate doar o singură dată, iar aplicației dvs. nu li se va permite să efectueze alte activități.

Cei doi parametri care jobFinished (JobParameters params, boolean needsRescheduled) sunt luate sunt JobParameters care au fost transmise JobService clasa în onStartJob (JobParameters params) metoda și o valoare booleană care permite sistemului să știe dacă ar trebui să reprogrameze lucrarea pe baza cerințelor inițiale ale jobului. Această valoare booleană este utilă pentru a înțelege, deoarece este modul în care gestionați situațiile în care sarcina dvs. nu poate fi finalizată din cauza altor probleme, cum ar fi un apel de rețea nereușit.

Cu manipulant instanța creată, puteți continua implementarea onStartJob (JobParameters params) și onStopJob (parola JobParameters) metode pentru a vă controla sarcinile. Veți observa că în fragmentul de cod următor, onStartJob (JobParameters params) revine metoda Adevărat. Acest lucru se datorează faptului că veți folosi a manipulant de exemplu pentru a controla funcționarea dvs., ceea ce înseamnă că ar putea dura mai mult timp până la terminare onStartJob (JobParameters params) metodă. Prin întoarcere Adevărat, permiteți aplicației să știe că veți apela manual jobFinished (JobParameters params, boolean needsRescheduled) metodă. Veți observa, de asemenea, numărul 1 este trecut la manipulant instanță. Acesta este identificatorul pe care îl veți utiliza pentru a face referire la lucrare.

@Override public boolean onStartJob (JobParameters params) mJobHandler.sendMessage (Message.obtain (mJobHandler, 1, params)); return true;  @Override public boolean onStopJob (parola JobParameters) mJobHandler.removeMessages (1); return false; 

Odată ce ați terminat cu porțiunea Java din JobSchedulerServiceclasa, trebuie să intri în AndroidManifest.xml și adăugați a nod pentru serviciu, astfel încât aplicația dvs. are permisiunea de a lega și de a folosi această clasă ca a JobService.

2. Crearea Planificatorului de Lucru

Cu JobSchedulerServiceclasa terminată, putem începe să ne uităm la modul în care aplicația dvs. va interacționa cu JobScheduler API-ul. Primul lucru pe care trebuie să-l faceți este să creați o JobScheduler obiect, numit mJobScheduler din exemplul de cod și inițializați-l prin obținerea unei instanțe a serviciului de sistem JOB_SCHEDULER_SERVICE. În aplicația de probă, acest lucru se face în Activitate principalaclasă.

mJobScheduler = (JobScheduler) getSystemService (Context.JOB_SCHEDULER_SERVICE);

Când doriți să creați sarcina programată, puteți utiliza funcția JobInfo.Builder pentru a construi o JobInfo obiect care trece la serviciul tău. Pentru a crea un JobInfo obiect, JobInfo.Builder acceptă doi parametri. Primul este identificatorul lucrării pe care o veți executa, iar al doilea este numele componentei serviciului pe care îl veți utiliza cu JobScheduler API-ul.

JobInfo.Builder builder = nou JobInfo.Builder (1, numeNet Component (getPackageName (), JobSchedulerService.class.getName ()));

Acest constructor vă permite să setați multe opțiuni diferite pentru a controla când va executa sarcina. Următorul fragment de cod arată cum ați putea seta sarcina dvs. să ruleze periodic la fiecare trei secunde.

builder.setPeriodic (3000);

Alte metode includ:

  • setMinimumLatency (lungime minLatencyMillis): Aceasta face ca munca dvs. să nu fie lansată până când numărul de milisecunde indicat nu a trecut. Acest lucru este incompatibil cu setPeriodic (timp îndelungat) și voi provocați o excepție care ar trebui aruncată dacă ambele sunt utilizate.
  • setOverrideDeadline (lung maxExecutionDelayMillis): Acest lucru va stabili un termen limită pentru locul de muncă. Chiar dacă nu sunt îndeplinite alte cerințe, sarcina dvs. va începe aproximativ când a trecut timpul dat. Ca setMinimumLatency (timp îndelungat), această funcție se exclude reciproc cu setPeriodic (timp îndelungat) și voi provocați o excepție care ar trebui aruncată dacă ambele sunt utilizate.
  • setPersisted (boolean isPersisted): Această funcție spune sistemului dacă sarcina dvs. ar trebui să continue să existe după ce dispozitivul a fost repornit.
  • setRequiredNetworkType (int networkType): Această funcție vă va spune că poate porni numai dacă dispozitivul se află pe un anumit tip de rețea. Valoarea implicită este JobInfo.NETWORK_TYPE_NONE, ceea ce înseamnă că sarcina poate rula dacă există conectivitate în rețea sau nu. Celelalte două tipuri disponibile sunt JobInfo.NETWORK_TYPE_ANY, care necesită un anumit tip de conexiune la rețea disponibilă pentru executarea lucrării și JobInfo.NETWORK_TYPE_UNMETERED, care necesită ca dispozitivul să se afle într-o rețea non-celulară.
  • setRequiresCharging (boolean necesită încărcare): Utilizarea acestei funcții vă va spune aplicației că operația nu ar trebui să înceapă până când dispozitivul nu a început să se încarce.
  • setRequiresDeviceIdle (boolean requiresDeviceIdle): Aceasta vă spune să nu începeți decât dacă utilizatorul nu utilizează dispozitivul și nu l-au folosit de ceva timp.

Este important să rețineți asta setRequiredNetworkType (int networkType), setRequiresCharging (boolean requireCharging) și setRequiresDeviceIdle (boolean requireIdle) poate determina munca ta să nu pornească decât dacă nu setOverrideDeadline (mult timp) este de asemenea setat, permițând executarea sarcinii dvs. chiar dacă condițiile nu sunt îndeplinite. După ce se specifică condițiile preferate, puteți construi JobInfo obiect și trimite-l la dvs. JobScheduler obiect așa cum se arată mai jos.

dacă (mJobScheduler.schedule (builder.build ()) <= 0 )  //If something goes wrong 

Veți observa că programa operația returnează un număr întreg. Dacă programa eșuează, va reveni la o valoare de zero sau mai mică, corespunzând unui cod de eroare. În caz contrar, acesta va returna identificatorul de locuri de muncă pe care l-am definit în JobInfo.Builder.

Dacă cererea dvs. necesită oprirea unei anumite sau a tuturor lucrărilor, puteți face acest lucru sunând anulați (int jobId) sau cancelAll () pe JobScheduler obiect.

mJobScheduler.cancelAll ();

Ar trebui să puteți folosi acum JobScheduler API cu propriile aplicații pentru lucrări batch și pentru a rula operațiunile de fundal.

Concluzie

În acest articol, ați învățat cum să implementați a JobService subclasa care folosește a manipulant obiect pentru a rula sarcinile de fundal pentru aplicația dvs. De asemenea, ați învățat cum să utilizați JobInfo.Builder pentru a seta cerințele pentru momentul în care serviciul dvs. ar trebui să ruleze. Folosind aceste funcții, ar trebui să puteți îmbunătăți modul în care funcționează propriile aplicații, ținând cont de consumul de energie.

Cod