Î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.
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.
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 JobSchedulerService
clasa, 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
.
Cu JobSchedulerService
clasa 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 principala
clasă.
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.
Î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.