Optymalizowanie wykorzystania baterii przez interfejsy API do planowania zadań

Na tej stronie sugerujemy kilka sprawdzonych metod konfigurowania poprawnie wykonywanych zadań w tle. Te sprawdzone metody zostały opracowane z myślą o zmniejszaniu zużycia baterii, ale mogą też poprawić wydajność urządzenia na inne sposoby, np. ograniczyć wykorzystanie sieci.

Wybieranie optymalnych ograniczeń i łączenie zadań

Aby zminimalizować obciążenie zadaniami na urządzeniu, warto określić optymalne ograniczenia. (W przypadku zadań JobScheduler sprawdź listę ograniczeń w sekcji JobInfo.Builder). Jeśli na przykład chcesz mieć pewność, że aplikacja nie wyczerpuje baterii, warto określić ograniczenie RequiresCharging. To ograniczenie informuje system, aby nie uruchamiał zadania, chyba że poziom baterii faktycznie wzrasta. Podobnie korzystanie z Wi-Fi zużywa mniej energii niż mobilna transmisja danych. Jeśli więc Twoje zadanie wymaga połączenia sieciowego, ale może poczekać, aż będzie dostępna sieć bez pomiaru, warto ustawić ograniczenie NetworkType.UNMETERED.

Jeśli masz kilka podobnych zadań podlegających tym samym ograniczeniom, warto połączyć je w jedno zadanie, aby urządzenie wybudzało się tylko raz. Załóżmy np., że aplikacja ma 3 różne zbiory danych, które musi synchronizować się z pamięcią w chmurze. Zamiast planować 3 różne zadania – po jednym na każdy zbiór danych – zwykle lepiej jest zaplanować jedno zadanie „synchronizowania danych”, zdefiniować odpowiednie ograniczenia i pozwolić mu na wykonanie wszystkich oczekujących synchronizacji danych po uruchomieniu.

Nie łącz jednak niepowiązanych zadań w jedno jedno kompleksowe zadanie. Pamiętaj tylko, by każde zadanie mieć odpowiednie ograniczenia. Jeśli na przykład zadania mają niski priorytet, określ, że powinny być uruchamiane, gdy urządzenie jest nieaktywne i się ładuje. Dzięki temu, nawet jeśli urządzenie zostanie wybudzone kilka razy, nie wpłynie to na wygodę użytkowników ani na żywotność baterii.

Oznaczaj zadania jako przyspieszone tylko wtedy, gdy są pilne

Jeśli zadanie jest szczególnie pilne, możesz oznaczyć je jako przyspieszone. W przypadku zadań JobScheduler wywołaj metodę JobInfo.Builder.setExpedited(true). Dzięki temu zadanie nada mu różne priorytety. Na przykład system wykonuje te zadania natychmiast, gdy jest to możliwe, a ograniczenia zarządzania energią mają mniejsze szanse na wpływ na szybsze zadania.

Dlatego pamiętaj, by oznaczać zadania jako przyspieszone tylko wtedy, gdy jest to konieczne. Przyspieszone zadania mogą zastąpić niektóre usprawnienia systemu, więc szybsze zadania mogą zużywać więcej energii niż gdyby nie zostały oznaczone w ten sposób.

Jako przyspieszone należy oznaczać zadanie tylko wtedy, gdy jest ono pilne, a to może negatywnie wpłynąć na wygodę użytkowników, gdy wykonanie zadania będzie trwało dłużej. Jeśli na przykład aplikacja uruchamia zadanie dotyczące wiadomości o wysokim priorytecie w FCM, to odpowiedni powód, aby oznaczyć to zadanie jako przyspieszone. Nie należy jednak oznaczać zadania jako przyspieszonego, tylko po to, aby zastąpić optymalizacje systemu.

Sprawdzanie, dlaczego zadania zostały zatrzymane

Jeśli zadania zatrzymują się, zanim zostaną ukończone, możesz sprawdzić, dlaczego zostały zatrzymane, wywołując metodę WorkInfo.getStopReason(). (W przypadku ofert pracy JobScheduler wywołanie JobParameters.getStopReason() jest ważne z kilku powodów. Przede wszystkim chcesz, żeby zadania dobiegły do końca. Dowiedz się, dlaczego działania zostały zatrzymane, aby uniknąć podobnych sytuacji. System prawdopodobnie zatrzyma też zadania z powodu swojego nadużywania zasobów systemowych. Nie chcesz, żeby Twoja aplikacja była złym obywatelem, zużywała niepotrzebnie baterii lub sieci.

Jeśli na przykład zadania często są zatrzymywane z powodem STOP_REASON_TIMEOUT, może się zdarzyć, że wykonanie zadania będzie trwało znacznie dłużej, niż się spodziewasz.

Do śledzenia, czy zadania aplikacji są zatrzymywane, i z jakich powodów zalecamy używanie silnika analityki.