Bruke JobScheduler API på Android Lollipop

I denne opplæringen lærer du hvordan du bruker JobScheduler API tilgjengelig i Android Lollipop. De JobScheduler API lar utviklere å lage jobber som utføres i bakgrunnen når visse betingelser er oppfylt.

Introduksjon

Når du arbeider med Android, vil det være tilfeller der du vil kjøre en oppgave på et senere tidspunkt eller under visse forhold, for eksempel når en enhet er koblet til en strømkilde eller koblet til et Wi-Fi-nettverk. Heldigvis med API 21, kjent av de fleste som Android Lollipop, har Google gitt en ny komponent kjent som JobScheduler API for å håndtere dette scenariet.

De JobScheduler API utfører en operasjon for søknaden din når et sett med forhåndsdefinerte betingelser er oppfylt. i motsetning til AlarmManager klassen, timingen er ikke nøyaktig. i tillegg JobScheduler API er i stand til å batch ulike jobber for å kjøre sammen. Dette gjør at appen din kan utføre den oppgitte oppgaven, samtidig som du tar hensyn til enhetens batteri på bekostning av tidsregulering.

I denne artikkelen vil du lære mer om JobScheduler API og JobService klassen ved å bruke dem til å kjøre en enkel bakgrunnsoppgave i en Android-applikasjon. Koden for denne opplæringen er tilgjengelig på GitHub.

1. Opprette Jobbtjenesten

For å starte, vil du lage et nytt Android-prosjekt med et minimumskrav på 21, fordi JobScheduler API ble lagt til i den nyeste versjonen av Android, og på skrivingstidspunktet er det ikke bakoverkompatibelt via et støttebibliotek.

Forutsatt at du bruker Android Studio, etter at du har slått på ferdig knappen for det nye prosjektet, bør du ha et "Bein World" -program med bare-bein. Det første trinnet du skal ta med dette prosjektet, er å skape en ny Java-klasse. For å holde ting enkelt, la oss nevne det JobSchedulerService og utvide JobService klasse, som krever at to metoder opprettes onStartJob (JobParameters params) og onStopJob (JobParameters params).

offentlig klasse JobSchedulerService utvider JobService @Override public boolean onStartJob (JobParameters params) return false;  @Override public boolean onStopJob (JobParameters params) return false; 

onStartJob (JobParameters params) er metoden du må bruke når du starter oppgaven din, fordi det er det systemet bruker til å utløse jobber som allerede er planlagt. Som du kan se, returnerer metoden en boolsk verdi. Hvis returverdi er falsk, Systemet antar at det som ikke har gått lang tid, og det gjøres på det tidspunktet metoden vender tilbake. Hvis returverdi er ekte, så antar systemet at oppgaven skal ta litt tid, og byrden faller på deg, utvikleren, for å fortelle systemet når den oppgitte oppgaven er fullført ved å ringe jobFinished (JobParameters params, boolean needsRescheduled).

onStopJob (JobParameters params) brukes av systemet for å avbryte ventende oppgaver når en avbestillingsforespørsel er mottatt. Det er viktig å merke seg at hvis onStartJob (JobParameters params) avkastning falsk, Systemet antar at det ikke er noen jobber som kjører når en avbestillingsforespørsel er mottatt. Det vil med andre ord ikke ringe onStopJob (JobParameters params).

En ting å merke seg er at jobbtjenesten kjører på søknadens hovedtråd. Dette betyr at du  bruk en annen tråd, en håndterer eller en asynkron oppgave for å kjøre lengre oppgaver for ikke å blokkere hovedtråden. Fordi multithreading teknikker er utenfor omfanget av denne opplæringen, la oss holde det enkelt og implementere en handler for å kjøre vår oppgave i JobSchedulerService klasse.

Private Handler mJobHandler = Ny Handler (Ny Handler.Callback () @Override det offentlige boolean handleMessage (Message msg) Toast.makeText (getApplicationContext (), "JobService-oppgave kjører", Toast.LENGTH_SHORT) .show (); jobFinished ( JobParameters) msg.obj, false); return true;);

I håndteringen implementerer du handleMessage (Message msg) metode som er en del av handler forekomst og få det til å løpe oppgavens logikk. I dette tilfellet holder vi ting veldig enkle og legger inn en Skål melding fra programmet, selv om dette er her du vil sette logikken din for ting som synkroniseringsdata.

Når oppgaven er ferdig, må du ringe jobFinished (JobParameters params, boolean needsRescheduled) å la systemet vite at du er ferdig med oppgaven, og at den kan begynne å kjøre opp neste operasjon. Hvis du ikke gjør dette, vil jobbene dine bare løpe en gang, og søknaden din får ikke lov til å utføre flere jobber.

De to parametrene som jobFinished (JobParameters params, boolean needsRescheduled) tar er JobParameters som ble sendt til JobService klasse i onStartJob (JobParameters params) metode og en boolsk verdi som lar systemet vite om det skal omstilles jobben basert på de opprinnelige kravene til jobben. Denne boolske verdien er nyttig å forstå, fordi det er hvordan du håndterer situasjoner der oppgaven din ikke klarer å fullføre på grunn av andre problemer, for eksempel et mislykket nettverksanrop.

Med handler instans opprettet, kan du gå videre og begynne å implementere onStartJob (JobParameters params) og onStopJob (JobParameters params) metoder for å kontrollere oppgavene dine. Du merker det i følgende kodestykke, den onStartJob (JobParameters params) metode returnerer ekte. Dette er fordi du skal bruke en handler eksempel for å kontrollere operasjonen din, noe som betyr at det kan ta lengre tid å fullføre enn onStartJob (JobParameters params) metode. Ved å returnere ekte, du lar programmet vite at du vil ringe manuelt jobFinished (JobParameters params, boolean needsRescheduled) metode. Du vil også merke at nummeret 1 blir sendt til handler forekomst. Dette er identifikatoren som du skal bruke for å referere til jobben.

@Override public boolean onStartJob (JobParameters params) mJobHandler.sendMessage (Message.obtain (mJobHandler, 1, params)); returnere sant;  @Override public boolean onStopJob (JobParameters params) mJobHandler.removeMessages (1); returner falsk; 

Når du er ferdig med Java-delen av JobSchedulerServiceklasse, må du gå inn AndroidManifest.xml og legg til en node for tjenesten slik at søknaden din har tillatelse til å binde og bruke denne klassen som en JobService.

2. Opprette jobbplanleggeren

Med JobSchedulerServiceklasse ferdig, kan vi begynne å se på hvordan søknaden din vil samhandle med JobScheduler API. Det første du må gjøre er å opprette en JobScheduler objekt, kalt mJobScheduler i prøvekoden, og initialiser den ved å få en forekomst av systemtjenesten JOB_SCHEDULER_SERVICE. I prøveapplikasjonen gjøres dette i Hoved aktivitetklasse.

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

Når du vil opprette din planlagte oppgave, kan du bruke JobInfo.Builder å konstruere en JobInfo objekt som blir sendt til din tjeneste. Å opprette en JobInfo gjenstand, JobInfo.Builder aksepterer to parametere. Den første er identifikatoren for jobben du vil kjøre, og den andre er komponentnavnet til tjenesten du vil bruke med JobScheduler API.

JobInfo.Builder builder = ny JobInfo.Builder (1, nytt ComponentName (getPackageName (), JobSchedulerService.class.getName ()));

Denne byggeren lar deg sette mange forskjellige alternativer for å kontrollere når jobben din skal utføres. Følgende kodestykke viser hvordan du kan angi at oppgaven din skal løpe regelmessig hvert tredje sekund.

builder.setPeriodic (3000);

Andre metoder inkluderer:

  • setMinimumLatency (long minLatencyMillis): Dette gjør at jobben din ikke starter før det angitte antallet millisekunder har passert. Dette er uforenlig med setPeriodic (lang tid) og vil føre til at et unntak kastes hvis de begge brukes.
  • setOverrideDeadline (lang maxExecutionDelayMillis): Dette vil angi en frist for jobben din. Selv om andre krav ikke er oppfylt, starter oppgaven din omtrent når den angitte tiden har gått. Som setMinimumLatency (lang tid), denne funksjonen er gjensidig utelukkende med setPeriodic (lang tid) og vil føre til at et unntak kastes hvis de begge brukes.
  • setPersisted (boolean erPersisted): Denne funksjonen forteller systemet om oppgaven din bør fortsette å eksistere etter at enheten har startet på nytt.
  • setRequiredNetworkType (int networkType): Denne funksjonen vil fortelle jobben din at den bare kan starte hvis enheten er på en bestemt type nettverk. Standard er JobInfo.NETWORK_TYPE_NONE, noe som betyr at oppgaven kan løpe om det er nettverkstilkobling eller ikke. De to andre tilgjengelige typene er JobInfo.NETWORK_TYPE_ANY, som krever en type nettverkstilkobling tilgjengelig for jobben til å kjøre, og JobInfo.NETWORK_TYPE_UNMETERED, som krever at enheten er på et ikke-mobilnettverk.
  • setRequiresCharging (boolean kreverCharging): Ved å bruke denne funksjonen, vil programmet fortelle at jobben ikke skal starte før enheten har startet lading.
  • setRequiresDeviceIdle (boolean requiresDeviceIdle): Dette forteller at jobben din ikke skal starte, med mindre brukeren ikke bruker enheten, og de har ikke brukt den i noen tid.

Det er viktig å merke seg det setRequiredNetworkType (int networkType), setRequiresCharging (boolean requireCharging) og setRequiresDeviceIdle (Boolean RequireIdle) kan føre til at jobben din aldri starter, med mindre setOverrideDeadline (lang tid) er også satt, slik at jobben din kan kjøre selv om betingelsene ikke er oppfylt. Når de foretrukne forholdene er oppgitt, kan du bygge JobInfo objekt og send det til din JobScheduler objekt som vist nedenfor.

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

Du vil legge merke til at rute operasjon returnerer et heltall. Hvis rute mislykkes, vil det returnere en verdi på null eller mindre, tilsvarende en feilkode. Ellers vil det returnere jobbidentifikatoren som vi definerte i JobInfo.Builder.

Hvis din søknad krever at du stopper en bestemt eller alle jobber, kan du gjøre det ved å ringe avbryte (int jobbId) eller cancelAll () på JobScheduler gjenstand.

mJobScheduler.cancelAll ();

Du bør nå kunne bruke JobScheduler API med dine egne applikasjoner til batchjobber og kjøre bakgrunnsoperasjoner.

Konklusjon

I denne artikkelen har du lært hvordan du implementerer en JobService underklasse som bruker a handler Motta å kjøre bakgrunnsoppgaver for søknaden din. Du har også lært hvordan du bruker JobInfo.Builder å stille krav til når tjenesten skal kjøre. Ved å bruke disse, bør du kunne forbedre hvordan dine egne applikasjoner fungerer mens du er oppmerksom på strømforbruket.