Använda JobScheduler API på Android Lollipop

I denna handledning lär du dig hur du använder JobScheduler API tillgängligt i Android Lollipop. De JobScheduler API tillåter utvecklare att skapa jobb som körs i bakgrunden när vissa villkor är uppfyllda.

Introduktion

När du arbetar med Android kommer det att finnas tillfällen där du kommer att vilja köra en uppgift vid en senare tidpunkt eller under vissa förhållanden, till exempel när en enhet är ansluten till en strömkälla eller ansluten till ett Wi-Fi-nätverk. Tack och lov med API 21, som är känt av de flesta som Android Lollipop, har Google tillhandahållit en ny komponent som kallas JobScheduler API för att hantera detta mycket scenario.

De JobScheduler API utför en operation för din ansökan när en uppsättning fördefinierade villkor är uppfyllda. till skillnad från AlarmManager klass, tidpunkten är inte exakt. Dessutom har JobScheduler API kan satsa olika jobb att köra ihop. Detta gör det möjligt för din app att utföra den angivna uppgiften samtidigt som du tar hänsyn till enhetens batteri till kostnaden för tidsstyrning.

I den här artikeln kommer du lära dig mer om JobScheduler API och JobService klass genom att använda dem för att köra en enkel bakgrundsuppgift i en Android-applikation. Koden för denna handledning finns på GitHub.

1. Skapa jobbtjänsten

För att börja, kommer du vilja skapa ett nytt Android-projekt med ett minimumskrav på 21, eftersom JobScheduler API har lagts till i den senaste versionen av Android och är vid skrivning inte bakåtkompatibel via ett supportbibliotek.

Om du antar att du använder Android Studio, efter att du har klickat på färdiga knappen för det nya projektet, borde du ha en "Hello World" applikation med bara ben. Det första steget du ska ta med detta projekt är att skapa en ny Java-klass. För att hålla det enkelt, låt oss namnge det JobSchedulerService och förlänga JobService klass, vilket kräver att två metoder skapas onStartJob (JobParameters params) och onStopJob (JobParameters params).

public class JobSchedulerService utökar JobService @Override public boolean onStartJob (JobParameters params) return false;  @Override public boolean onStopJob (JobParameters params) return false; 

onStartJob (JobParameters params) är den metod som du måste använda när du börjar din uppgift, eftersom det är vad systemet använder för att utlösa jobb som redan har planerats. Som du kan se returnerar metoden ett booleskt värde. Om returvärdet är falsk, systemet förutsätter att den uppgift som har körts inte tar lång tid och görs när tekniken återvänder. Om returvärdet är Sann, då antar systemet att uppgiften kommer att ta lite tid och bördan faller på dig, utvecklaren, att berätta för systemet när den givna uppgiften är avslutad genom att ringa jobFinished (JobParameters params, boolean needsRescheduled).

onStopJob (JobParameters params) används av systemet för att avbryta pågående uppgifter när en avbrytningsförfrågan mottas. Det är viktigt att notera att om onStartJob (JobParameters params) avkastning falsk, Systemet antar att det inte finns några jobb som för närvarande körs när en avbeställningsförfrågan mottas. Med andra ord kommer det helt enkelt inte att ringa onStopJob (JobParameters params).

En sak att notera är att jobbet tjänar på din applikations huvudtråd. Det betyder att du måste använd en annan tråd, en hanterare eller en asynkron uppgift för att köra längre uppgifter för att inte blockera huvudtråden. Eftersom multithreadtekniker ligger utanför ramen för denna handledning, låt oss hålla det enkelt och genomföra en hanterare för att köra vår uppgift i JobSchedulerService klass.

privat hanterare mJobHandler = ny handler (nytt Handler.Callback () @Override public boolean handleMessage (Meddelande msg) Toast.makeText (getApplicationContext (), "JobService task running", Toast.LENGTH_SHORT) .show (); jobFinished JobParameters) msg.obj, false); return true;);

I hanteraren implementerar du handleMessage (Message msg) metod som är en del av Hanterare exempel och få det att driva din uppgift logik. I det här fallet håller vi saker väldigt enkelt och skickar ett Rostat bröd meddelande från programmet, men det är här du skulle lägga din logik för saker som synkroniseringsdata.

När uppgiften är klar måste du ringa jobFinished (JobParameters params, boolean needsRescheduled) för att låta systemet veta att du är klar med den uppgiften och att det kan börja köpa nästa operation. Om du inte gör det, kommer dina jobb bara att köras en gång och din ansökan kommer inte att tillåtas utföra ytterligare jobb.

De två parametrarna som jobFinished (JobParameters params, boolean needsRescheduled) tar är JobParameters som överfördes till JobService klass i onStartJob (JobParameters params) metod och ett booleskt värde som låter systemet veta om det ska omplanera jobbet baserat på de ursprungliga kraven i jobbet. Detta booleska värde är användbart för att förstå, eftersom det är hur du hanterar situationer där din uppgift inte kan slutföras på grund av andra problem, t.ex. ett misslyckat nätverkssamtal.

Med Hanterare Exempel skapad, du kan gå vidare och börja implementera onStartJob (JobParameters params) och onStopJob (JobParameters params) metoder för att styra dina uppgifter. Det kommer du att märka att i följande kodbit, onStartJob (JobParameters params) metod returnerar Sann. Detta beror på att du ska använda en Hanterare Exempel på att styra din operation, vilket innebär att det kan ta längre tid att avsluta än onStartJob (JobParameters params) metod. Genom att återvända Sann, du låter programmet veta att du kommer att ringa manuellt jobFinished (JobParameters params, boolean needsRescheduled) metod. Du märker också numret 1 skickas till Hanterare exempel. Detta är den identifierare som du ska använda för att referera till jobbet.

@Override public boolean onStartJob (JobParameters params) mJobHandler.sendMessage (Message.obtain (mJobHandler, 1, params)); återvänd sant;  @Override public boolean onStopJob (JobParameters params) mJobHandler.removeMessages (1); returnera false; 

När du är klar med Java-delen av JobSchedulerServiceklass måste du gå in i AndroidManifest.xml och lägg till en nod för tjänsten så att din ansökan har tillstånd att binda och använda den här klassen som en JobService.

2. Skapa jobbschemaläggaren

Med JobSchedulerServiceklassen klar, kan vi börja titta på hur din ansökan kommer att interagera med JobScheduler API. Det första du behöver göra är att skapa en JobScheduler objekt, som kallas mJobScheduler i provkoden och initiera den genom att få en instans av systemtjänsten JOB_SCHEDULER_SERVICE. I provapplikationen görs detta i Huvudaktivitetklass.

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

När du vill skapa din schemalagda uppgift kan du använda JobInfo.Builder att konstruera en JobInfo objekt som skickas till din tjänst. För att skapa en JobInfo objekt, JobInfo.Builder accepterar två parametrar. Den första är identifieraren för jobbet som du kommer att köra och det andra är komponentnamnet på den tjänst som du ska använda med JobScheduler API.

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

Denna byggmästare låter dig ställa in många olika alternativ för att styra när ditt jobb ska utföras. Följande kodsekvens visar hur du kan ställa in din uppgift att köra regelbundet var tredje sekund.

builder.setPeriodic (3000);

Andra metoder inkluderar:

  • setMinimumLatency (long minLatencyMillis): Detta gör att ditt jobb inte startas förrän det angivna antalet millisekunder har passerat. Detta är oförenligt med setPeriodic (lång tid) och kommer orsaka ett undantag att kastas om de båda används.
  • setOverrideDeadline (long maxExecutionDelayMillis): Detta ställer in en tidsfrist för ditt jobb. Även om andra krav inte uppfylls, startar din uppgift ungefär när den angivna tiden har gått. Tycka om setMinimumLatency (lång tid), denna funktion utesluter varandra med setPeriodic (lång tid) och kommer orsaka ett undantag att kastas om de båda används.
  • setPersisted (Boolean isPersisted): Den här funktionen berättar om systemet ska fortsätta att vara kvar efter att enheten har startats om.
  • setRequiredNetworkType (int networkType): Den här funktionen kommer att berätta för ditt jobb att den bara kan starta om enheten är på en viss typ av nätverk. Standard är JobInfo.NETWORK_TYPE_NONE, vilket innebär att uppgiften kan köra om det finns nätverksanslutning eller inte. De andra två tillgängliga typerna är JobInfo.NETWORK_TYPE_ANY, vilket kräver en viss typ av nätverksanslutning tillgänglig för jobbet att köra, och JobInfo.NETWORK_TYPE_UNMETERED, vilket kräver att enheten är på ett icke-cellulärt nätverk.
  • setRequiresCharging (Boolean kräver Charging): Genom att använda den här funktionen kommer din program att berätta att jobbet inte ska börja tills enheten har börjat ladda.
  • setRequiresDeviceIdle (Boolean requiresDeviceIdle): Detta berättar att ditt jobb inte startar om användaren inte använder sin enhet och de inte har använt den för en tid.

Det är viktigt att notera det setRequiredNetworkType (int networkType), setRequiresCharging (Boolean requireCharging) och setRequiresDeviceIdle (Boolean RequireIdle) kan få ditt jobb att aldrig börja om inte setOverrideDeadline (lång tid) är också inställd så att ditt jobb kan köras även om villkoren inte är uppfyllda. När de föredragna villkoren anges kan du bygga JobInfo objekt och skicka det till din JobScheduler objekt som visas nedan.

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

Du märker att schema operationen returnerar ett heltal. Om schema misslyckas kommer det att returnera ett värde på noll eller mindre, vilket motsvarar en felkod. Annars kommer det att returnera den jobbidentifierare som vi definierade i JobInfo.Builder.

Om din ansökan kräver att du stoppar en specifik eller alla jobb, kan du göra det genom att ringa Avbryt (int jobbId) eller cancelAll () på JobScheduler objekt.

mJobScheduler.cancelAll ();

Du borde nu kunna använda JobScheduler API med egna applikationer till batchjobb och kör bakgrundsoperationer.

Slutsats

I den här artikeln har du lärt dig hur du implementerar en JobService underklass som använder a Hanterare motsätta dig att köra bakgrundsuppgifter för din ansökan. Du har också lärt dig hur du använder JobInfo.Builder att ställa krav på när din tjänst ska köras. Med hjälp av dessa bör du kunna förbättra hur dina egna applikationer fungerar medan du är uppmärksam på strömförbrukningen.