Android 8.0 i zmiany w background jobs
Tworząc aplikacje mobilne na system Android od wersji api 26 (Android Oreo) napotkamy na dodatkowe ograniczenia przy operacjach, które będą wykonywane przez naszą aplikację w tle (usługi).
Ograniczenia dotyczą wszystkich aplikacji, które będą uruchamiane od tej wersji systemu. Aplikacje targetowane na wcześniejsze wersje api będą działać i zachowywać się w dotychczasowy sposób jedynie pod warunkiem, że użytkownik nie włączy dla nich dodatkowych restrykcji w ustawieniach systemu.
Jest to duża i ważna zmiana – do tej pory nie było w systemie android takich restrykcji. Mogliśmy stworzyć usługę, która w sposób ciągły wykonywała jakąś pracę w tle np. co sekundę wysyłała pozycję z GPS użytkownika. Zmiana ta podyktowana jest tym, aby zwiększyć pozytywne doświadczenia użytkowników systemu android i bardziej optymalnie podejść do racjonalnego zużycia takich zasobów jak naładowanie baterii, a finalnie, aby wydłużyć długość pracy smartphone’a na jednym naładowaniu baterii.
Ciekawostka: problem ograniczonego zasobu jakim jest zgromadzona energii w bateriach/akumulatorach jest problemem stosunkowo łatwym do rozwiązania, zgadza się – łatwym. Już w czasach zimnej wojny używano kompaktowych rozmiarów tzw. baterii atomowych (np. przy zasilaniu boi morskich), które produkowały prąd z energii rozpadu pierwiastków ciężkich. Niestety ten sposób rozwiązania problemu nie jest możliwy do zastosowania w realnym świecie- nie z powodu przeszkód technicznych w przypadku poprawnego zabezpieczenia takich baterii, ale innych zagrożeń).
Polecam ciekawy artykuł: http://innpoland.pl/135609,rosyjscy-naukowcy-skonstruowali-atomowa-baterie-wielkosci-paznokcia-moze-dzialac-to-nie-zart-50-lat
Jak wyglądają zmiany z punktu widzenia programisty?
Jeżeli aplikacja jest w stanie foreground – czyli jest uruchomiona i widoczna dla użytkownika np. uruchomione jest activity to bez przeszkód może ona tworzyć foreground jak i background servicy wykorzystując metodę startService() lub startForegroundService(), ale jeżeli przejdzie w stan background np. poprzez wyjście z niej, znajdzie się w specjalnym oknie czasowym (jest to parę minut). W trakcie trwania tego okna czasowego wystartowanie wcześniej usługi dalej działają, a nawet bez przeszkód można stworzyć nowe, ale po zakończeniu tego okna czasowego wywoływana jest metoda Service.stopSelf() , która zatrzymuje wszystkie usługi.
W niektórych sytuacjach nasza aplikacja zostaje umieszczona na specjalnej white-liście (również na czas paru minut). Te sytuacje to:
- Otrzymanie wiadomości FCM o wysokim priorytecie,
- Otrzymanie wiadomości SMS lub MMS
- Wywołanie pending intent z notyfikacji
- Wystartowanie VpnService
Aplikacja w tych sytuacjach może wystartować usługę, ale i tutaj usługa pozostaje uruchomiona przez jakiś czas, po którym jest zatrzymywana.
Wskazówki migracji aplikacji
- Jeżeli potrzebujesz odpalić usługę, która działa w trakcie działania aplikacji używaj startForegroundService(), zamiast startService()
- Jeżeli potrzebujesz wykonać jakąś pracę wtedy kiedy aplikacja nie jest uruchomiona użyj scheduled job – dzięki wykorzystaniu tego mechanizmu możesz wykonać jakąś pracę co określony czas np. raz dziennie.
- Jeżeli potrzebujesz wykonać jakąś pracę, dla której nie możesz ustalić harmonogramu wykorzystaj notyfikacje push – FCM.
- Poczekaj z pracą w tle do momentu kiedy aplikacja zostanie włączona ponownie.