Verwenden der JobScheduler-API auf Android Lollipop

In diesem Lernprogramm erfahren Sie, wie Sie das verwenden JobScheduler API in Android Lollipop verfügbar. Das JobScheduler Mit der API können Entwickler Jobs erstellen, die im Hintergrund ausgeführt werden, wenn bestimmte Bedingungen erfüllt sind.

Einführung

Wenn Sie mit Android arbeiten, kann es vorkommen, dass Sie eine Aufgabe zu einem späteren Zeitpunkt oder unter bestimmten Bedingungen ausführen möchten, z. B. wenn ein Gerät an eine Stromquelle angeschlossen ist oder mit einem Wi-Fi-Netzwerk verbunden ist. Zum Glück hat API 21, das von den meisten Leuten als Android Lollipop bezeichnet wird, eine neue Komponente namens the bereitgestellt JobScheduler API für dieses Szenario.

Das JobScheduler Die API führt eine Operation für Ihre Anwendung aus, wenn eine Reihe vordefinierter Bedingungen erfüllt ist. nicht so wie AlarmManager Klasse, der Zeitpunkt ist nicht genau. zusätzlich JobScheduler Die API kann verschiedene Jobs zusammenfassen, um zusammen auszuführen. Auf diese Weise kann Ihre App die angegebene Aufgabe ausführen, wobei der Akku des Geräts zu Lasten der zeitlichen Steuerung ist.

In diesem Artikel erfahren Sie mehr über die JobScheduler API und die JobService Klasse, indem Sie sie verwenden, um eine einfache Hintergrundaufgabe in einer Android-Anwendung auszuführen. Der Code für dieses Tutorial ist auf GitHub verfügbar.

1. Erstellen des Job Service

Um zu beginnen, sollten Sie ein neues Android-Projekt mit einer mindestens erforderlichen API von 21 erstellen, da die JobScheduler API wurde in der neuesten Version von Android hinzugefügt und ist zum Zeitpunkt des Schreibens nicht über eine Support-Bibliothek abwärtskompatibel.

Vorausgesetzt, Sie verwenden Android Studio, nachdem Sie die Schaltfläche "Fertig" für das neue Projekt gedrückt haben, sollten Sie eine "Hello World" -Anwendung haben. Der erste Schritt, den Sie mit diesem Projekt machen, ist das Erstellen einer neuen Java-Klasse. Um es einfach zu halten, nennen wir es JobSchedulerService und erweitern die JobService Klasse, die erfordert, dass zwei Methoden erstellt werden onStartJob (JobParameters-Parameter) und onStopJob (JobParameters-Parameter).

public class JobSchedulerService erweitert JobService @Override public boolean onStartJob (JobParameters-Parameter) return false;  @Override public boolean onStopJob (JobParameters-Parameter) return false; 

onStartJob (JobParameters-Parameter) Dies ist die Methode, die Sie zu Beginn Ihrer Aufgabe verwenden müssen, da das System die Ausführung von bereits geplanten Jobs auslöst. Wie Sie sehen, gibt die Methode einen booleschen Wert zurück. Wenn der Rückgabewert ist falsch, Das System geht davon aus, dass die Ausführung aller Aufgaben nicht lange gedauert hat und bis zur Rückkehr der Methode abgeschlossen ist. Wenn der Rückgabewert ist wahr, Dann geht das System davon aus, dass die Aufgabe einige Zeit in Anspruch nehmen wird und Sie, der Entwickler, die Last tragen müssen, um dem System mitzuteilen, wann die angegebene Aufgabe abgeschlossen ist jobFinished (JobParameters-Parameter, boolesche Anforderungen werden neu festgelegt).

onStopJob (JobParameters-Parameter) wird vom System verwendet, um anstehende Aufgaben abzubrechen, wenn eine Abbruchanforderung empfangen wird. Es ist wichtig zu beachten, dass onStartJob (JobParameters-Parameter) kehrt zurück falsch, Das System geht davon aus, dass derzeit keine Jobs ausgeführt werden, wenn eine Abbruchanforderung empfangen wird. Mit anderen Worten, es wird einfach nicht angerufen onStopJob (JobParameters-Parameter).

Zu beachten ist, dass der Job-Service im Haupt-Thread Ihrer Anwendung ausgeführt wird. Das heißt du müssen, zu ... haben Verwenden Sie einen anderen Thread, einen Handler oder eine asynchrone Task, um längere Tasks auszuführen, um den Haupt-Thread nicht zu blockieren. Da Multithreading-Techniken den Rahmen dieses Tutorials sprengen, sollten wir es einfach halten und einen Handler implementieren, um unsere Task im JobSchedulerService Klasse.

private Handler mJobHandler = new Handler (neuer Handler.Callback () @Override public boolean handleMessage (Nachricht msg) Toast.makeText (getApplicationContext (), "JobService-Task läuft", Toast.LENGTH_SHORT) .show (); jobFinished (); JobParameters) msg.obj, false); return true;);

Im Handler implementieren Sie die handleMessage (Message msg) Methode, die ein Teil von ist Handler Instanz und lassen Sie es die Logik Ihrer Aufgabe ausführen. In diesem Fall halten wir die Dinge sehr einfach und posten ein Toast Nachricht von der Anwendung, obwohl Sie Ihre Logik für Dinge wie das Synchronisieren von Daten verwenden.

Wenn die Aufgabe erledigt ist, müssen Sie anrufen jobFinished (JobParameters-Parameter, boolesche Anforderungen werden neu festgelegt) Um dem System mitzuteilen, dass Sie mit dieser Aufgabe fertig sind und den nächsten Vorgang in die Warteschlange stellen können. Wenn Sie dies nicht tun, werden Ihre Jobs nur einmal ausgeführt, und Ihre Anwendung darf keine weiteren Jobs ausführen.

Die zwei Parameter das jobFinished (JobParameters-Parameter, boolesche Anforderungen werden neu festgelegt) nimmt sind die JobParameter das wurden an die übergeben JobService Klasse in der onStartJob (JobParameters-Parameter) Methode und ein boolescher Wert, der dem System mitteilt, ob es den Job basierend auf den ursprünglichen Anforderungen des Jobs neu planen soll. Dieser boolesche Wert ist hilfreich, um zu verstehen, wie Sie mit Situationen umgehen, in denen Ihre Aufgabe aufgrund anderer Probleme, z. B. eines fehlgeschlagenen Netzwerkaufrufs, nicht ausgeführt werden kann.

Mit dem Handler Instanz erstellt, können Sie fortfahren und die Implementierung der onStartJob (JobParameters-Parameter) und onStopJob (JobParameters-Parameter) Methoden zur Kontrolle Ihrer Aufgaben. Sie werden das im folgenden Codeausschnitt bemerken, der onStartJob (JobParameters-Parameter) Methode kehrt zurück wahr. Dies liegt daran, dass Sie eine verwenden werden Handler Instanz, um Ihren Betrieb zu steuern, was bedeutet, dass es länger dauern kann, als den Vorgang abzuschließen onStartJob (JobParameters-Parameter) Methode. Durch die Rückkehr wahr, Sie lassen die Anwendung wissen, dass Sie die manuell aufrufen werden jobFinished (JobParameters-Parameter, boolesche Anforderungen werden neu festgelegt) Methode. Sie werden auch feststellen, dass die Nummer 1 wird an die übergeben Handler Beispiel. Dies ist die Kennung, die Sie zum Referenzieren des Jobs verwenden werden.

@Override public boolean onStartJob (JobParameters-Parameter) mJobHandler.sendMessage (Message.obtain (mJobHandler, 1, params)); wahr zurückgeben;  @Override public boolean onStopJob (JobParameters-Parameter) mJobHandler.removeMessages (1); falsch zurückgeben; 

Sobald Sie mit dem Java-Teil von fertig sind JobSchedulerServiceKlasse, Sie müssen in gehen AndroidManifest.xml und fügen Sie ein Knoten für den Dienst, damit Ihre Anwendung die Berechtigung zum Binden und Verwenden dieser Klasse als JobService.

2. Erstellen Sie den Job Scheduler

Mit JobSchedulerServiceNach Abschluss der Unterrichtsstunde können wir uns ansehen, wie Ihre Anwendung mit der Anwendung interagiert JobScheduler API. Das erste, was Sie tun müssen, ist ein JobScheduler Objekt, aufgerufen mJobScheduler im Beispielcode und initialisieren Sie ihn, indem Sie eine Instanz des Systemdiensts abrufen JOB_SCHEDULER_SERVICE. In der Beispielanwendung erfolgt dies in der HauptaktivitätKlasse.

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

Wenn Sie Ihre geplante Aufgabe erstellen möchten, können Sie die verwenden JobInfo.Builder ein konstruieren JobInfo Objekt, das an Ihren Dienst übergeben wird. So erstellen Sie eine JobInfo Objekt, JobInfo.Builder akzeptiert zwei Parameter. Der erste ist der Bezeichner des Jobs, den Sie ausführen werden, und der zweite ist der Komponentenname des Dienstes, den Sie mit dem Dienst verwenden JobScheduler API.

JobInfo.Builder builder = new JobInfo.Builder (1, neuer Komponentenname (getPackageName (), JobSchedulerService.class.getName ()));

Mit diesem Builder können Sie viele verschiedene Optionen für die Steuerung festlegen, wann Ihr Job ausgeführt wird. Der folgende Codeausschnitt zeigt, wie Sie Ihre Task so einstellen können, dass sie alle drei Sekunden regelmäßig ausgeführt wird.

Builder.setPeriodic (3000);

Andere Methoden umfassen:

  • setMinimumLatency (long minLatencyMillis): Dadurch wird Ihr Job erst gestartet, wenn die angegebene Anzahl von Millisekunden vergangen ist. Dies ist nicht kompatibel mit setPeriodic (lange Zeit) und werden bewirkt, dass eine Ausnahme ausgelöst wird, wenn beide verwendet werden.
  • setOverrideDeadline (long maxExecutionDelayMillis): Dies setzt eine Frist für Ihre Arbeit. Auch wenn andere Anforderungen nicht erfüllt sind, beginnt Ihre Aufgabe ungefähr, wenn die angegebene Zeit verstrichen ist. Mögen setMinimumLatency (lange Zeit), Diese Funktion schließt sich gegenseitig mit aus setPeriodic (lange Zeit) und werden bewirkt, dass eine Ausnahme ausgelöst wird, wenn beide verwendet werden.
  • setPersisted (boolean isPersisted): Diese Funktion teilt dem System mit, ob Ihre Aufgabe nach dem Neustart des Geräts bestehen bleiben soll.
  • setRequiredNetworkType (int networkType): Diese Funktion teilt Ihrem Job mit, dass er nur gestartet werden kann, wenn sich das Gerät in einem bestimmten Netzwerk befindet. Der Standardwert ist JobInfo.NETWORK_TYPE_NONE, Dies bedeutet, dass die Task unabhängig von der Netzwerkverbindung ausgeführt werden kann. Die anderen zwei verfügbaren Typen sind JobInfo.NETWORK_TYPE_ANY, Für die Ausführung des Jobs ist eine Art Netzwerkverbindung erforderlich, und JobInfo.NETWORK_TYPE_UNMETERED, Dies erfordert, dass sich das Gerät in einem nicht-Mobilfunknetz befindet.
  • setRequiresCharging (Boolean RequiresCharging): Wenn Sie diese Funktion verwenden, wird Ihre Anwendung darauf hingewiesen, dass der Job nicht gestartet werden darf, bevor das Gerät aufgeladen wurde.
  • setRequiresDeviceIdle (boolean requiredDeviceIdle): Dies weist Ihren Job an, nicht zu starten, es sei denn, der Benutzer verwendet sein Gerät nicht und hat es längere Zeit nicht verwendet.

Es ist wichtig, das zu beachten setRequiredNetworkType (int networkType), setRequiresCharging (boolean requiredCharging) und setRequiresDeviceIdle (boolean requiredIdle) kann dazu führen, dass Ihre Arbeit niemals beginnt, setOverrideDeadline (lange Zeit) Außerdem wird festgelegt, dass der Job ausgeführt werden kann, auch wenn die Bedingungen nicht erfüllt sind. Sobald die bevorzugten Bedingungen angegeben sind, können Sie das erstellen JobInfo Objekt und senden Sie es an Ihre JobScheduler Objekt wie unten gezeigt.

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

Sie werden feststellen, dass die Zeitplan Operation gibt eine Ganzzahl zurück. Ob Zeitplan schlägt der Wert fehl, wird ein Wert von Null oder weniger zurückgegeben, der einem Fehlercode entspricht. Andernfalls wird die von uns definierte Job-ID zurückgegeben JobInfo.Builder.

Wenn für Ihre Anwendung das Anhalten bestimmter oder aller Jobs erforderlich ist, können Sie dies durch Aufrufen tun abbrechen (int jobId) oder alle Absagen() auf der JobScheduler Objekt.

mJobScheduler.cancelAll ();

Sie sollten jetzt in der Lage sein, die JobScheduler API mit Ihren eigenen Anwendungen zum Stapeln von Jobs und Ausführen von Hintergrundoperationen.

Fazit

In diesem Artikel haben Sie gelernt, wie Sie ein implementieren JobService Unterklasse, die a verwendet Handler Objekt, um Hintergrundaufgaben für Ihre Anwendung auszuführen. Sie haben auch gelernt, wie Sie das verwenden JobInfo.Builder Festlegen, wann der Dienst ausgeführt werden soll. Wenn Sie diese verwenden, sollten Sie in der Lage sein, die Funktionsweise Ihrer eigenen Anwendungen zu verbessern und dabei den Stromverbrauch zu berücksichtigen.