2017-09-19 22 views
9

Moja aplikacja wykorzystuje klasyczny wzór zaplanować okresowe zadania:W jaki sposób powinienem przeprowadzić moją aplikację, aby korzystać z JobScheduler?

  1. Ustaw dokładną alarm poprzez AlarmManager (przez setExactAndAllowWhileIdle(), ponieważ musi zgasnąć nawet w drzemać)
  2. rozpocząć IntentService z onReceive() poprzez WakefulBroadcastReceiver.startWakefulService()
  3. Wykonaj pracę w onHandleIntent() i zadzwoń pod WakefulBroadcastReceiver.completeWakefulIntent() po zakończeniu.

Dziś zaktualizowałem targetSdkVersion do 26 oraz w obliczu straszliwego, że WakefulBroadcastReceiver jest nieaktualna.

poszedłem od razu odczytać docs API i stwierdził, co następuje:

Jako Android O, ograniczenia sprawdzenie uczynić ta klasa nie już ogólnie użyteczne. (Zasadniczo nie jest bezpieczne uruchamianie usługi z odbioru transmisji, ponieważ nie masz żadnych gwarancji, że Twoja aplikacja jest na pierwszym planie w tym momencie, a tym samym pozwoliła na to ). Zamiast tego deweloperzy powinni należy użyć android.app.job.JobScheduler do zaplanować pracę, a to nie wymaga, aby aplikacja trzymała w tym czasie blokadę (system zadba o przytrzymanie blokady wybudzenia dla zadania).

To trochę mylące dla mnie, nie bardzo rozumiem, jaki jest cel AlarmManager.setExactAndAllowWhileIdle(), nie mogąc już więcej utrzymać urządzenia w stanie czuwania.

Jak widzę, nie mogę ustawić dokładnego czasu, aby uruchomić zadanie z JobScheduler, tylko warunki (takie jak typ sieci lub stan ładowania), więc nie mam pojęcia, co tutaj zrobić.

myślałem obu

  • Korzystanie AlarmManager i JobScheduler razem

    ustawić alarm (z setExactAndAllowWhileIdle()) i rozpocząć pracę (poprzez JobScheduler) bezpośrednio od onReceive(). Od JobScheduler zapewnia WakeLock, WakefulBroadcastReceiver nie jest potrzebne.

    (czy to ma sens?)

lub

  • nadal korzystać WakefulBroadcastReceiver pomimo przestarzała.

Naprawdę doceniam wszelkie porady w tej sprawie.

+0

się znaleźć odpowiedź ba ??? –

Odpowiedz

0

w Android-o, a później można zdefiniować powtarzalne zadania bez alarmmanager tak:

// schedule the start of the service "TestJobService" every 10 - 30 minutes 
public static void scheduleJob(Context context) { 
    ComponentName serviceComponent = new ComponentName(context, TestJobService.class); 
    JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent); 
    builder.setMinimumLatency(10 * 60 * 1000); // wait at least 
    builder.setOverrideDeadline(30 * 60 * 1000); // maximum delay 
    JobScheduler jobScheduler = context.getSystemService(JobScheduler.class); 
    jobScheduler.schedule(builder.build()); 
} 
Powiązane problemy