2016-06-02 8 views
1

Wie genau funktioniert die Methode "setRequireDeviceIdle" von JobInfo.Builder? Von dem, was ich in der Android-Dokumentation (https://developer.android.com/reference/android/app/job/JobInfo.Builder.html#setRequiresDeviceIdle(boolean)) angegeben habe, sollte es garantieren, dass Ihre Jobs nur gestartet werden, wenn keine Interaktion mit dem Gerät stattgefunden hat.Android JobScheduler setRequiresDeviceIdle

Meine Erfahrung ist es anders:

private void scheduleRestartJob(){ 
    ComponentName mServiceComponent = new ComponentName(this, RelaunchAppJobService.class); 

    JobInfo.Builder builder = new JobInfo.Builder(1002, mServiceComponent); 
    builder.setRequiresDeviceIdle(true); 
    builder.setPersisted(true); 
    builder.setOverrideDeadline(10000); 
    mJobScheduler.schedule(builder.build()); 
} 

Wenn ich meine Anwendung zu beenden, und starten Sie ein anderes zu verwenden, spielt es keine Rolle, ob ich aktiv bin oder nicht, da der Job immer nach dem Lauf wird 10 Sekunden.

Antwort

0

Wenn ich meine App verlasse und eine andere benutze, ist es egal, ob ich aktiv bin oder nicht, da der Job immer nach den 10 Sekunden ausgeführt wird.

, dass wegen dieser Linie ist:

builder.setOverrideDeadline(10000); 

the documentation Zitiert:

Der Auftrag wird bis zu diesem Zeitpunkt ausgeführt werden auch wenn andere Anforderungen nicht erfüllt

(Hervorhebung hinzugefügt)

Ihr Job läuft also, wenn das Gerät im Leerlauf oder in 10 Sekunden abläuft, je nachdem, was zuerst eintritt. Aller Wahrscheinlichkeit nach werden die 10 Sekunden zuerst verstreichen.

+0

Nun, das ist sinnvoll, aber vor der Verwendung von "setOverrideDeadline" habe ich "setPeriodic" mit den gleichen 10 Sekunden verwendet. Das Verhalten war jedoch das gleiche (obwohl sich die Dokumentation nicht darauf bezieht, dass es die anderen Anforderungen ignoriert). Was ich hier erreichen möchte, ist es, meine App neu zu starten, wenn der Benutzer für eine bestimmte Zeit untätig war. – flame

+0

Der Grund, warum Sie dieses Verhalten unter Verwendung von 'setPeriodic' ohne' setOverrideDeadline' gesehen haben, ist, dass 'setPeriodic' trotz der Aussage der Dokumentation implizit eine Überschreibungsfrist setzt und alle anderen Anforderungen ignoriert. Es scheint, dass Sie diesen Fehler umgehen können, indem Sie eine 'if (! JobParameters.isOverrideDeadlineExpired())' Prüfung in Ihre 'onStartJob' Methode setzen. – HexAndBugs

Verwandte Themen