In deze zelfstudie leert u hoe u de JobScheduler
API beschikbaar in Android Lollipop. De JobScheduler
API staat ontwikkelaars toe om taken te creëren die op de achtergrond worden uitgevoerd wanneer aan bepaalde voorwaarden wordt voldaan.
Wanneer u met Android werkt, zijn er gelegenheden waarbij u een taak op een later tijdstip of onder bepaalde voorwaarden wilt uitvoeren, bijvoorbeeld wanneer een apparaat op een voedingsbron is aangesloten of op een Wi-Fi-netwerk is aangesloten. Gelukkig met API 21, bekend bij de meeste mensen als Android Lollipop, heeft Google een nieuwe component geleverd die bekend staat als de JobScheduler
API om met dit scenario om te gaan.
De JobScheduler
API voert een bewerking uit voor uw toepassing wanneer aan een reeks vooraf gedefinieerde voorwaarden is voldaan. In tegenstelling tot de AlarmManager
klasse, de timing is niet exact. tevens de JobScheduler
API kan verschillende taken tegelijk laten uitvoeren. Hierdoor kan uw app de opgegeven taak uitvoeren terwijl u rekening houdt met de batterij van het apparaat ten koste van de timingcontrole.
In dit artikel leert u meer over de JobScheduler
API en de JobService
klasse door ze te gebruiken om een eenvoudige achtergrondtaak uit te voeren in een Android-applicatie. De code voor deze tutorial is beschikbaar op GitHub.
Om te beginnen, wil je een nieuw Android-project maken met een minimale vereiste API van 21, omdat de JobScheduler
API is toegevoegd in de meest recente versie van Android en is op het moment van schrijven niet achterwaarts compatibel via een ondersteuningsbibliotheek.
Ervan uitgaande dat u Android Studio gebruikt, moet u nadat u de voltooide knop voor het nieuwe project hebt geraakt, een "Hallo Wereld" -toepassing gebruiken. De eerste stap die u met dit project gaat zetten, is het maken van een nieuwe Java-klasse. Laten we het een naam geven om dingen eenvoudig te houden JobSchedulerService en verleng de JobService
klasse, waarvoor twee methoden moeten worden gemaakt onStartJob (Parameters JobParameters)
en onStopJob (Parameters JobParameters)
.
public class JobSchedulerService breidt JobService uit @Override public boolean onStartJob (Parameters JobParameters) return false; @Override public boolean onStopJob (Parameters JobParameters) return false;
onStartJob (Parameters JobParameters)
is de methode die u moet gebruiken wanneer u met uw taak begint, omdat dit het systeem is dat wordt gebruikt om taken te triggeren die al zijn gepland. Zoals u kunt zien, retourneert de methode een Booleaanse waarde. Als de retourwaarde is vals
, het systeem gaat ervan uit dat welke taak dan ook is uitgevoerd niet lang heeft geduurd en wordt uitgevoerd op het moment dat de methode terugkeert. Als de retourwaarde is waar
, dan veronderstelt het systeem dat de taak enige tijd gaat duren en de last op u, de ontwikkelaar, rust om het systeem te vertellen wanneer de gegeven taak voltooid is door te bellen jobFinished (JobParameters params, boolean needsRescheduled)
.
onStopJob (Parameters JobParameters)
wordt door het systeem gebruikt om lopende taken te annuleren wanneer een annuleringsverzoek wordt ontvangen. Het is belangrijk om op te merken dat als onStartJob (Parameters JobParameters)
komt terug vals
, het systeem gaat ervan uit dat er momenteel geen taken lopen wanneer een annuleringsverzoek wordt ontvangen. Met andere woorden, het zal gewoon niet bellen onStopJob (Parameters JobParameters)
.
Een ding om op te merken is dat de jobservice op de hoofdthread van uw toepassing wordt uitgevoerd. Dit betekent dat jij moet gebruik een andere thread, een handler of een asynchrone taak om langere taken uit te voeren om de hoofdthread niet te blokkeren. Omdat multithreading-technieken buiten het bereik van deze tutorial vallen, laten we het eenvoudig houden en een handler implementeren om onze taak uit te voeren in de JobSchedulerService
klasse.
private Handler mJobHandler = new Handler (new Handler.Callback () @Override public Boolean handleMessage (Message msg) Toast.makeText (getApplicationContext (), "JobService task running", Toast.LENGTH_SHORT) .show (); jobFinished (( JobParameters) msg.obj, false); return true;);
In de handler implementeer je de handleMessage (berichtbericht)
methode die onderdeel is van handler
en laat het de logica van uw taak uitvoeren. In dit geval houden we dingen heel simpel en plaatsen we een Geroosterd brood
bericht van de toepassing, hoewel dit is waar u uw logica zou plaatsen voor zaken als het synchroniseren van gegevens.
Als de taak is voltooid, moet je bellen jobFinished (JobParameters params, boolean needsRescheduled)
om het systeem te laten weten dat je klaar bent met die taak en dat het in de rij kan staan voor de volgende operatie. Als u dit niet doet, zullen uw taken slechts één keer worden uitgevoerd en uw toepassing zal geen toestemming krijgen om extra taken uit te voeren.
De twee parameters dat jobFinished (JobParameters params, boolean needsRescheduled)
takes zijn de JobParameters
die werden doorgegeven aan de JobService
klasse in de onStartJob (Parameters JobParameters)
methode en een Booleaanse waarde waarmee het systeem weet of het de taak opnieuw moet plannen op basis van de oorspronkelijke vereisten van de taak. Deze Booleaanse waarde is handig om te begrijpen, omdat u hiermee omgaat met situaties waarin uw taak niet kan worden voltooid vanwege andere problemen, zoals een mislukte netwerkoproep.
Met de handler
instantie gemaakt, kunt u doorgaan en beginnen met de implementatie van onStartJob (Parameters JobParameters)
en onStopJob (Parameters JobParameters)
methoden om uw taken te beheren. U zult merken dat in het volgende codefragment de onStartJob (Parameters JobParameters)
methode retourneert waar
. Dit komt omdat je een a gaat gebruiken handler
bijvoorbeeld om uw operatie te besturen, wat betekent dat het langer zou kunnen duren om te voltooien dan de onStartJob (Parameters JobParameters)
methode. Door terug te keren waar
, u laat de toepassing weten dat u de app handmatig zult bellen jobFinished (JobParameters params, boolean needsRescheduled)
methode. Je zult ook merken dat het nummer 1
wordt doorgegeven aan de handler
aanleg. Dit is de ID die u gaat gebruiken om naar de taak te verwijzen.
@Override public boolean onStartJob (Parameters JobParameters) mJobHandler.sendMessage (Message.obtain (mJobHandler, 1, params)); geef waar terug; @Override public boolean onStopJob (Parameters JobParameters) mJobHandler.removeMessages (1); return false;
Als je klaar bent met het Java-gedeelte van de JobSchedulerService
klas, je moet ingaan AndroidManifest.xml en voeg een toe knooppunt voor de service, zodat uw toepassing toestemming heeft om te binden en deze klasse te gebruiken als een JobService
.
Met JobSchedulerService
Als de cursus klaar is, kunnen we gaan kijken naar hoe uw applicatie met de JobScheduler
API. Het eerste dat u moet doen is een maken JobScheduler
voorwerp, genaamd mJobScheduler
in de voorbeeldcode en initialiseer deze door een exemplaar van de systeemservice te krijgen JOB_SCHEDULER_SERVICE
. In de voorbeeldtoepassing wordt dit gedaan in de Hoofdactiviteit
klasse.
mJobScheduler = (JobScheduler) getSystemService (Context.JOB_SCHEDULER_SERVICE);
Wanneer u uw geplande taak wilt maken, kunt u de JobInfo.Builder
om een te bouwen JobInfo
object dat aan uw service wordt doorgegeven. Om een te maken JobInfo
voorwerp, JobInfo.Builder
accepteert twee parameters. De eerste is de ID van de taak die u zult uitvoeren en de tweede is de componentnaam van de service die u zult gebruiken met de JobScheduler
API.
JobInfo.Builder builder = new JobInfo.Builder (1, nieuwe ComponentName (getPackageName (), JobSchedulerService.class.getName ()));
Met deze opbouwfunctie kunt u veel verschillende opties instellen om te bepalen wanneer uw taak wordt uitgevoerd. Het volgende codefragment laat zien hoe u uw taak kunt instellen om elke drie seconden periodiek te worden uitgevoerd.
builder.setPeriodic (3000);
Andere methoden zijn onder meer:
setMinimumLatency (long minLatencyMillis)
: Hierdoor wordt uw taak pas gestart nadat het aangegeven aantal milliseconden is verstreken. Dit is niet compatibel met setPeriodic (lange tijd)
en zullen een uitzondering veroorzaken om te worden gegooid als ze beide worden gebruikt.setOverrideDeadline (long maxExecutionDelayMillis)
: Hiermee wordt een deadline voor uw taak ingesteld. Zelfs als niet aan andere vereisten wordt voldaan, begint uw taak ongeveer wanneer de opgegeven tijd verstreken is. Net zoals setMinimumLatency (lange tijd)
, deze functie is wederzijds exclusief met setPeriodic (lange tijd)
en zullen een uitzondering veroorzaken om te worden gegooid als ze beide worden gebruikt.setPersisted (boolean isPersisted)
: Deze functie vertelt het systeem of uw taak moet blijven bestaan nadat het apparaat opnieuw is opgestart.setRequiredNetworkType (int networkType)
: Met deze functie wordt uw taak aangegeven dat deze alleen kan worden gestart als het apparaat zich op een specifiek soort netwerk bevindt. De standaard is JobInfo.NETWORK_TYPE_NONE
, wat betekent dat de taak kan worden uitgevoerd of er een netwerkverbinding is of niet. De andere twee beschikbare typen zijn JobInfo.NETWORK_TYPE_ANY
, waarvoor een bepaald soort netwerkverbinding vereist is om de taak uit te voeren, en JobInfo.NETWORK_TYPE_UNMETERED
, wat vereist dat het apparaat zich op een niet-cellulair netwerk bevindt.setRequiresCharging (boolean requiresCharging)
: Met deze functie wordt aan uw toepassing gemeld dat de taak niet moet worden gestart voordat het apparaat is begonnen met laden.setRequiresDeviceIdle (boolean requireDeviceIdle)
: Hiermee wordt uw taak aangegeven om niet te starten, tenzij de gebruiker zijn apparaat niet gebruikt en deze al een tijd niet heeft gebruikt.Het is belangrijk om dat op te merken setRequiredNetworkType (int networkType)
, setRequiresCharging (Boolean requireCharging)
en setRequiresDeviceIdle (Boolean requireIdle)
kan ervoor zorgen dat je werk nooit van start gaat, tenzij setOverrideDeadline (lange tijd)
is ook ingesteld, zodat uw taak kan worden uitgevoerd, zelfs als niet aan de voorwaarden wordt voldaan. Zodra de gewenste voorwaarden zijn vermeld, kunt u de JobInfo
object en stuur het naar uw JobScheduler
object zoals hieronder getoond.
if (mJobScheduler.schedule (builder.build ()) <= 0 ) //If something goes wrong
Je zult merken dat het planning
bewerking retourneert een geheel getal. Als planning
mislukt, wordt een waarde van nul of minder geretourneerd die overeenkomt met een foutcode. Anders wordt de taak-id die we in de. Hebben gedefinieerd, geretourneerd JobInfo.Builder
.
Als uw toepassing vereist dat u een specifieke of alle taken stopt, kunt u dit doen door te bellen cancel (int jobId)
of Verwijder alles()
op de JobScheduler
voorwerp.
mJobScheduler.cancelAll ();
Je zou nu de JobScheduler
API met uw eigen toepassingen om batchtaken uit te voeren en achtergrondbewerkingen uit te voeren.
In dit artikel hebt u geleerd hoe u een JobService
subklasse die een handler
object om achtergrondtaken voor uw toepassing uit te voeren. Je hebt ook geleerd hoe je de JobInfo.Builder
om vereisten in te stellen voor wanneer uw service moet worden uitgevoerd. Als u deze gebruikt, zou u in staat moeten zijn om te verbeteren hoe uw eigen toepassingen werken terwijl u rekening houdt met het stroomverbruik.