Hei kaikille! Tässä artikkelissa käsittelemme Android-palveluita (services).
Palvelut ovat yksi Androidin keskeisistä perusominaisuuksista. Niillä on tärkeä rooli Android-sovelluskehityksessä, joten palveluiden toimintaan kannattaa perehtyä huolellisesti. Tässä artikkelissa käymme palvelut läpi yksityiskohtaisesti.
Palvelu (service) on Android-sovelluksen komponentti, joka voi suorittaa pitkäkestoisia tehtäviä taustalla. Palvelu on Android-komponentti muiden komponenttien tapaan, mutta se toimii näkymättömissä taustalla.
Palveluiden toinen erityispiirre on se, ettei niillä ole omaa käyttöliittymää. Palvelut eivät tarvitse käyttöliittymää, koska ne eivät ole vuorovaikutuksessa käyttäjän kanssa. Muut Android-komponentit ovat yleensä vuorovaikutuksessa käyttäjän kanssa (esimerkiksi sähköpostikenttä, salasanakenttä tai painikkeiden klikkaaminen), mutta palveluilta tämä puuttuu.
Palvelun voi käynnistää jokin toinen Android-komponentti. Esimerkiksi kun klikkaat sovelluksessa painiketta, tämä painike voi käynnistää palvelun taustalle.

Käytännön esimerkkinä voidaan mainita tiedoston lataaminen verkosta. Kun klikkaat sovelluksessa latauspainiketta, palvelu alkaa ladata tiedostoa taustalla. Tiedosto voi toisinaan olla hyvin suuri, ja lataus voi viedä aikaa. Palvelu ottaa lataustehtävän hoitaakseen taustalla, ja voit sillä välin jatkaa sovelluksen käyttöä.
Tässä latausesimerkissä:
Ensinnäkin lataus tapahtuu taustalla.
Toiseksi tällä latauspalvelulla ei ole käyttöliittymää. Se voi näyttää käyttäjälle edistymispalkin tai ilmoituksen, mutta nämä eivät kuulu itse päänäkymään (activity) tai sovellusikkunaan.
Kolmanneksi palvelu käynnistettiin latauspainikkeesta. Palvelukomponentti käynnistyi siis toisen komponentin eli painikkeen kautta.

Toinen esimerkki palvelusta on musiikkisoitinsovellus. Musiikkisoitin voi jatkaa valitun kappaleen toistamista taustalla.
Kolmas esimerkki voisi olla kuvan lataaminen verkosta taustalla.
Tai sovellus voi lähettää tietoja palvelimelle taustalla.
Palveluista voisi antaa paljon muitakin esimerkkejä; niitä käytetään Android-sovelluksissa hyvin monipuolisesti.
Android-sovelluksissa on kolme eri palvelutyyppiä.
Etualapalvelut (foreground services)

Etualapalveluissa käyttäjä näkee prosessin etenemisen. Jos sovelluksesi esimerkiksi lataa tiedostoa taustalla, kyseessä on etualapalvelu. Etualapalvelussa käyttäjälle on näytettävä ilmoitus (notification) ja latauksen edistyminen, ja latauksen valmistuttua käyttäjälle annetaan siitä tieto.
Palvelun on myös jatkettava toimintaansa taustalla silloinkin, kun käyttäjä ei käytä sovellusta aktiivisesti. Jos sovellus aloittaa esimerkiksi suuren, vaikkapa yhden gigatavun kokoisen tiedoston latauksen, käyttäjä voi jatkaa sovelluksen käyttöä tai jopa poistua siitä kokonaan, mutta lataus jatkuu silti.
Taustapalvelut (background services)

Taustapalveluissa prosessi ei näy käyttäjälle. Sovellus ei näytä käyttäjälle ilmoituksia, ja toisinaan käyttäjä ei edes tiedä taustalla pyörivästä palvelusta. Voit hoitaa kaiken taustalla.
Kehität esimerkiksi sovellusta, joka tallentaa valokuvia laitteen muistiin. Samalla kun sovellus tallentaa kuvia, se voi pakata ne taustalla. Käyttäjän ei tarvitse tietää pakkausprosessista tai siitä, mitä sovellus taustalla tarkalleen ottaen tekee. Mitä käyttäjä tekee? Hän vain ottaa kuvat ja tallentaa ne laitteeseen. Voit luoda taustalle pakkauspalvelun, jotta kuvat vievät vähemmän tallennustilaa ja sovellus toimii puhelimessa sujuvammin.
Voit pakata kuvat taustalla ja purkaa ne jälleen tarpeen vaatiessa. Tässä palvelussa suoritat toimenpiteitä taustalla käyttäjän huomaamatta, eikä käyttäjä ole vuorovaikutuksessa palvelun kanssa.
Sidotut palvelut (bound services)

Sidotussa palvelussa palvelu on riippuvainen sitä kutsuvasta komponentista ja on siihen jatkuvassa yhteydessä. Kun kutsuva komponentti sulkeutuu, myös palvelu pysähtyy eikä jää pyörimään taustalle. Alan kirjallisuudessa tätä kutsutaan asiakas-palvelin-suhteeksi (client-server). Tässä suhteessa palvelu toimii palvelimena ja sen käynnistänyt komponentti asiakkaana.
Musiikkisoitin voi toimia esimerkkinä myös sidotusta palvelusta. Kun käynnistät musiikkisoitinsovelluksen, palvelu lähettää soittimelle säännöllisesti tietoja, kuten mikä kappale soi, mikä on seuraavan kappaleen nimi tai monennellako minuutilla kappale on menossa. Kun käyttäjä sulkee sovelluksen, myös musiikki lakkaa soimasta. Kun avaat sovelluksen uudelleen, toisto voi jatkua. Palvelu on siis jatkuvassa vuorovaikutuksessa komponentin kanssa. Tällaista palvelua kutsutaan sidotuksi palveluksi (bound service).
Itse palvelun koodaamisessa käytetään kahta eri palveluluokkaa.
Ensimmäinen on tavallinen Service-luokka.

Mitä tavallinen Service-luokka tarkoittaa? Se on perinteinen palveluluokka, joka vastaa koko tehtävästä itsenäisesti. Tämän luokan ominaispiirre on kuitenkin se, että se käyttää sovelluksen pääsäiettä (main thread).
Tätä kohtaa on hyvä avata tarkemmin. Android-käyttöjärjestelmä antaa kullekin sovellukselle oman osuutensa suorittimen tehosta. Sovelluksesi käyttää tätä suoritinresurssia, ja myös palvelusi jakaa saman resurssin. Jos palvelu vie suurimman osan tehosta, sovelluksesi hidastuu. Siksi raskaisiin tehtäviin ei kannata käyttää tavallista Service-luokkaa, jottei sovellus ala takkuilla. Pieniin tehtäviin tavallisen Service-luokan voi sen sijaan käyttää.
Oletetaan, että sovelluksesi lataa elokuvaa verkosta ja haluat samalla käyttää sovellusta. Lataaminen vie aikaa ja kuluttaa sovelluksen resursseja, joten samanaikaisessa käytössä sovellus toimii hitaasti. Käyttäjät eivät halua hidastelevaa sovellusta, joten ongelma täytyy ratkaista.
Tässä apuun tulee toinen palveluluokka: IntentService.

IntentService-luokka on Service-luokan aliluokka. IntentService ei käytä sovelluksen pääsäiettä, vaan se luo oman erillisen työsäikeensä ja toimii siinä. Toisin sanoen se pyytää Android-käyttöjärjestelmältä oman suoritinresurssinsa. Tämä ei hidasta sovellusta. IntentService-luokkaa käytetäänkin pitkäkestoisiin taustaprosesseihin.
Siinä kaikki tältä erää. Tässä oli katsaus Android-palveluihin. Nähdään seuraavassa artikkelissa!
