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.
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.
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 må 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 JobSchedulerService
klasse, 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
.
Med JobSchedulerService
klasse 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 aktivitet
klasse.
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.
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.