Android 8.0 i zmiany w background jobs

 In Mobile, Technicznie

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

  1. Jeżeli potrzebujesz odpalić usługę, która działa w trakcie działania aplikacji używaj startForegroundService(), zamiast startService()
  2. 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.
  3. Jeżeli potrzebujesz wykonać jakąś pracę, dla której nie możesz ustalić harmonogramu wykorzystaj notyfikacje push – FCM.
  4. Poczekaj z pracą w tle do momentu kiedy aplikacja zostanie włączona ponownie.

 

Recommended Posts

Leave a Comment