Using den JobScheduler API på Android Lollipop
53
Del
52
Del
Dette Cyber mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
I denne opplæringen vil du lære hvordan du bruker JobScheduler API tilgjengelig i Android Lollipop. Den JobScheduler API tillater utviklere å skape arbeidsplasser som utfører i bakgrunnen når visse vilkår er oppfylt.
Innledning
Når du arbeider med Android, vil det være tilfeller hvor du ønsker å 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 svært scenario.
JobScheduler API utfører en operasjon for søknaden din når et sett med forhåndsdefinert vilkår er oppfylt. I motsetning til AlarmManager klasse, er tidspunktet ikke eksakt. I tillegg er JobScheduler API stand til å batch ulike jobber å kjøre sammen. Dette gjør at appen utføre den gitte oppgaven samtidig som hensyns av enhetens batteri på bekostning av tidskontroll.
I denne artikkelen vil du lære mer om JobScheduler API og JobService klasse ved å bruke dem til å kjøre en enkel bakgrunn oppgave i en Android-applikasjon. Koden for denne opplæringen er tilgjengelig på GitHub.
1. Opprette jobb Tjenesten
Hvis du vil starte, du kommer til å ønske å opprette en ny Android-prosjekt med et minimumskrav API på 21, fordi JobScheduler API ble lagt i den nyeste versjonen av Android, og på I skrivende stund, er ikke bakoverkompatibel gjennom en støtte bibliotek.
Antar du bruker Android Studio, etter at du har truffet den ferdige knappen for det nye prosjektet, bør du ha en bare-bones "Hello World " søknad. Det første steget du kommer til å ta med dette prosjektet er å skape en ny Java-klassen. For å holde ting enkelt, la oss kalle det JobSchedulerService og forlenge JobService klassen, noe som krever at to metoder lages onStartJob (JobParameters params) og onStopJob (JobParameters params).
Public class JobSchedulerService strekker JobService {Override public boolean onStartJob (JobParameters params) {return false; }Override Public boolean onStopJob (JobParameters params) {return false; }}
onStartJob (JobParameters params) er den metoden som du må bruke når du begynner din oppgave, fordi det er hva systemet bruker til å utløse jobber som allerede er planlagt. Som du kan se, returnerer metoden en boolsk verdi. Hvis returverdien er falsk, antar systemet at uansett hva oppgaven har kjørt tok ikke lang tid og er gjort av den tiden som metoden returnerer. Hvis returverdien er sant, så systemet forutsetter at oppgaven kommer til å ta litt tid og byrden faller på deg, utvikleren, for å fortelle systemet når den gitte oppgaven er fullført ved å ringe jobFinished (JobParameters params, boolsk needsRescheduled) .
onStopJob (JobParameters params) brukes av systemet til å avbryte ventende oppgaver når en avbryter forespørselen er mottatt. Det er viktig å merke seg at hvis onStartJob (JobParameters params) returnerer false, antar systemet er det ingen jobber for tiden kjører når en avbryter forespørselen er mottatt. Med andre ord, det rett og slett ikke vil kalle onStopJob (JobParameters params).
En ting å merke seg er at jobben tjenesten kjører på programmets hovedtråden. Dette betyr at du må I handler, du implementere handleMessage (Message msg) metode som er en del av Handler eksempel og ha den kjøre din oppgave logikk. I dette tilfellet er vi holde ting veldig enkelt og publisere en Toast melding fra programmet, selv om det er der du vil sette din logikk for ting som synkronisering av data. Når oppgaven er ferdig, må du kalle jobFinished (JobParameters params, boolsk needsRescheduled) for å la systemet vite at du er ferdig med den oppgaven, og at det kan begynne i kø neste operasjon. Hvis du ikke gjør dette, vil din jobber bare kjørt en gang og søknaden vil ikke få lov til å utføre flere jobber. De to parametrene som jobFinished (JobParameters params, boolsk needsRescheduled) tar er de JobParameters som var sendes til JobService klassen i onStartJob (JobParameters params) metode og en boolsk verdi som gjør at systemet vet om det bør planlegge jobben basert på de opprinnelige kravene i jobben. Dette boolsk verdi er nyttig å forstå, fordi det er hvordan du håndterer situasjoner hvor din oppgave er ute av stand til å fullføre på grunn av andre problemer, for eksempel en mislykket nettverk samtale. Med Handler eksempel opprettet, kan du gå videre og begynne å implementere onStartJob (JobParameters params) og onStopJob (JobParameters params) metoder for å kontrollere dine oppgaver. Du vil merke at i følgende kodebiten, den onStartJob (JobParameters params) metoden returnerer sant. Dette er fordi du kommer til å bruke en Handler eksempel å kontrollere driften, noe som betyr at det kan ta lenger tid å fullføre enn onStartJob (JobParameters params) -metoden. Ved å returnere sant, du la programmet vet at du vil manuelt ringe jobFinished (JobParameters params, boolsk needsRescheduled) metoden. Du vil også legge merke til at nummer 1 er gått til Handler eksempel. Dette er identifikatoren at du kommer til å bruke for å registrere jobben Når du er ferdig med Java del av JobSchedulerService klassen, må du gå inn AndroidManifest.xml og legge til en node for tjenesten, slik at programmet har tillatelse til å binde og bruke denne klassen som en JobService Med JobSchedulerService klasse ferdig, kan vi begynne å se på hvordan søknaden skal samhandle med JobScheduler API. Det første du må gjøre er å lage en JobScheduler objekt, kalt mJobScheduler i eksempelkoden, og initialisere den ved å få en forekomst av systemet tjenesten JOB_SCHEDULER_SERVICE. I prøveprogrammet, gjøres dette i MainActivity klassen Når du ønsker å lage din planlagt oppgave, kan du bruke JobInfo.Builder å konstruere en JobInfo objekt som blir sendt til din tjeneste. For å opprette en JobInfo objekt, godtar JobInfo.Builder to parametere. Den første er identifikatoren til den jobben som du vil kjøre, og den andre er den komponenten navnet på tjenesten du vil bruke med JobScheduler API. Dette byggmester lar deg sette mange ulike alternativer for å kontrollere når jobben skal utføres. Følgende kodebiten viser hvordan du kan sette din oppgave å kjøre periodisk hvert tredje sekund Andre metoder er:. Det er viktig å merke seg at setRequiredNetworkType (int networkType), setRequiresCharging (boolsk requireCharging) og setRequiresDeviceIdle (boolsk requireIdle) kan forårsake din jobb å aldri begynne med mindre setOverrideDeadline (lang tid) er også satt, slik at din jobb å kjøre selv om forholdene ikke er oppfylt. Når de foretrukne prosent blir oppgitt, kan du bygge JobInfo objektet og send den til JobScheduler objekt som vist nedenfor Du vil merke at planen operasjonen returnerer et heltall. Hvis plan svikter, vil den returnere en verdi på null eller mindre, tilsvarende en feilkode. Ellers vil det komme tilbake jobben identifikator som vi definert i JobInfo.Builder. Hvis applikasjonen krever at du slutter å bruke en bestemt eller alle jobber, kan du gjøre det ved å ringe avbryte (int jobId) eller cancelAll () . på JobScheduler objektet Du skal nå kunne bruke JobScheduler API med dine egne applikasjoner til batch jobber og kjøre bakgrunnsoperasjoner
bruke en annen tråd, et behandlingsprogram, eller en asynkron oppgave å kjøre lengre oppgaver å ikke blokkere hovedtråden. Fordi multithreading teknikker er utenfor omfanget av denne opplæringen, la oss holde det enkelt og implementere et behandlingsprogram for å kjøre vår oppgave i JobSchedulerService klassen.
Privat Handler mJobHandler = new Handler (ny Handler.Callback () {Override public boolean handleMessage (Message msg) {Toast.makeText (getApplicationContext (), "JobService oppgave kjører", Toast.LENGTH_SHORT) .vis (); jobFinished ((JobParameters) msg.obj, false); return true;}});
Overridepublic boolsk onStartJob (JobParameters params) {mJobHandler.sendMessage (Message.obtain (mJobHandler, 1, params).); return true;} @ Overridepublic boolsk onStopJob (JobParameters params) {mJobHandler.removeMessages (1); return false;}
< tjeneste android: ".. JobSchedulerService" name = android: tillatelse = "android.permission.BIND_JOB_SERVICE" />
2. Opprette jobb Scheduler
mJobScheduler = (JobScheduler) getSystemService (Context.JOB_SCHEDULER_SERVICE);.
JobInfo.Builder byggmester = new JobInfo.Builder (1, ny ComponentName (getPackageName (), JobSchedulerService.class.getName ()));
builder.setPeriodic (3000);
forårsake et unntak kastes hvis de er begge brukes
setOverrideDeadline (lange maxExecutionDelayMillis). Dette vil sette en frist for jobben din. Selv om andre krav ikke er oppfylt, vil din oppgave starte omtrent når den oppgitte tiden har gått. Som setMinimumLatency (lang tid), er gjensidig utelukkende med setPeriodic (lang tid), og denne funksjonen vil
forårsake et unntak kastes hvis de er begge brukes.
setRequiredNetworkType (int networkType). Denne funksjonen vil fortelle din jobb som det kan bare starte hvis enheten er på en bestemt type nettverk. Standard er JobInfo.NETWORK_TYPE_NONE, noe som betyr at oppgaven kan kjøre om det er nettverkstilkobling eller ikke. De andre to tilgjengelige typer er JobInfo.NETWORK_TYPE_ANY, som krever noen form for nettverkstilkobling tilgjengelig for jobben å kjøre, og JobInfo.NETWORK_TYPE_UNMETERED, som krever at enheten være på et ikke-mobilnettverk.
setRequiresDeviceIdle (boolsk requiresDeviceIdle): Dette forteller din jobb å ikke starte med mindre brukeren ikke bruker sin enhet, og de har ikke brukt det på en stund.
if (mJobScheduler.schedule (builder.build ()) < = 0). {//Hvis noe går galt}
mJobScheduler.cancelAll ();.
Konklusjon
< p> I denne artikkelen, har du lært hvordan du skal gjennomføre en JobService underklasse som bruker en Handler objekt å 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 hjelp av disse, bør du være i stand til å forbedre hvordan dine egne applikasjoner operere samtidig være oppmerksom på strømforbruket.