Kun sovellus toimii taustalla, se kuluttaa osan laitteen rajallisista resursseista, kuten RAM-muistia. Tämä voi heikentää käyttökokemusta, varsinkin jos käyttäjä käyttää resursseja vaativaa sovellusta, kuten pelaa peliä tai katsoo videota. Käyttäjäkokemuksen parantamiseksi Android 8.0 (API-taso 26) asettaa rajoituksia sille, mitä sovellukset voivat tehdä toimiessaan taustalla. Tässä asiakirjassa kuvataan käyttöjärjestelmään tehdyt muutokset ja kerrotaan, miten voit päivittää sovelluksesi toimimaan hyvin uusien rajoitusten puitteissa.

Mikä on palvelu Androidissa?

Virkistetään ensin, mikä on palvelu Androidissa? Androidin dokumentaation mukaan:

A Service on sovelluskomponentti, joka voi suorittaa pitkäkestoisia operaatioita taustalla, eikä se tarjoa käyttöliittymää.

Palvelu on siis pohjimmiltaan sama asia kuin aktiviteetti, mutta siinä ei ole käyttöliittymäkomponenttia. Sen ei siis tarvitse suorittaa sulavaa animaatiota 60 fps:n nopeudella. Siksi se voi suorittaa minkä tahansa tehtävän pidemmän aikaa kuin aktiviteetti.

Palveluja on kolmea tyyppiä:

  • Käynnistetty palvelu – Palvelu käynnistetään, kun sovelluskomponentti (kuten aktiviteetti) kutsuu startService().
  • Sidottu palvelu – Palvelu sidotaan, kun sovelluskomponentti sitoutuu siihen kutsumalla bindService().
  • Ajastettu palvelu – Palvelu ajoitetaan, kun API, kuten JobScheduler.

Tausta- vs. etualasovellukset:

Oppiaksemme taustasuoritusmuutokset, meidän on ensin tunnettava taustasovelluksen ja etualasovelluksen välinen ero.

Nyrkkisääntö: Sovelluksesi katsotaan etualapalveluksi, jos jokin alla olevista kolmesta tapauksesta pitää paikkansa:

  1. Sovelluksellasi on tällä hetkellä näkyvää toimintaa.
  2. Sovelluksellasi on etualapalvelu käynnissä.
  3. Sovelluksesi on kytketty johonkin toiseen etualasovellukseen sitomalla palvelu tai kuluttamalla niiden sisällöntarjoajia.

Jos jokin edellä mainituista skenaarioista ei ole totta nykyisessä instanssissa, sovelluksesi katsotaan olevan taustalla.

Miksi meidän on rajoitettava taustapalveluiden käyttöä?

Kun sovelluksesi toimivat taustalla käyttäen palveluita, sovelluksesi kuluttaa kahta arvokasta resurssia: 1) muistia ja 2) akkua.

Nämä kaksi ovat rajallisia resursseja mobiililaitteissa, ja useimmissa matalan tai keskitason laitteissa ei ole runsaasti muistia tai akkua.

Es oletetaan, että jos sovelluksesi tekee joitakin erittäin intensiivisiä tehtäviä taustalla ja käyttää suuremman määrän RAM-muistia tehtävän suorittamiseen, tämä luo erittäin huonon käyttökokemuksen käyttäjälle, varsinkin jos käyttäjä käyttää toista resurssi-intensiivistä sovellusta, kuten pelaa peliä tai katselee videota etualalla.

Käynnistetyn palvelun dokumentaation mukaan paras käytäntö on,

Kun toiminto on suoritettu loppuun, palvelun pitäisi pysäyttää itsensä.

Mutta monissa sovelluksissa on pitkään käynnissä olevia taustapalveluita, jotka periaatteessa pyörivät loputtomasti joko pitääkseen yllä pistorasiayhteyttä palvelimeen tai valvoakseen joitain tehtäviä tai käyttäjän toimintaa. Nämä palvelut tyhjentävät akkua ja kuluttavat jatkuvasti muistia.

Parin viimeisimmän android-julkaisun (Marshmallowista alkaen) jälkeen Google on yrittänyt kovasti lisätä akkukestoa ja vähentää sovellusten käyttämää muistinkulutusta ottamalla käyttöön torkkutilan ja sovelluksen valmiustilan viivyttämällä taustasovelluksen suorittamista jollakin määrällä aikaa, jos puhelin on tyhjäkäynnillä.

Mutta useimmiten kehittäjät käyttävät niitä yhä, vaikka tietävätkin pitkäkestoisten palveluiden huonot puolet. (Lähinnä siksi, että se on helppo toteuttaa ja ylläpitää sen sijaan, että käyttäisivät muita kiertoteitä.)