När en app körs i bakgrunden förbrukar den en del av enhetens begränsade resurser, till exempel RAM-minne. Detta kan leda till en försämrad användarupplevelse, särskilt om användaren använder en resurskrävande app, till exempel spelar ett spel eller tittar på video. För att förbättra användarupplevelsen inför Android 8.0 (API-nivå 26) begränsningar för vad appar kan göra när de körs i bakgrunden. Det här dokumentet beskriver ändringarna i operativsystemet och hur du kan uppdatera din app så att den fungerar bra under de nya begränsningarna.

Vad är tjänsten i Android?

Låt oss först fräscha upp vad är tjänsten i Android? Enligt androiddokumentationen:

En Service är en applikationskomponent som kan utföra långvariga operationer i bakgrunden, och den tillhandahåller inget användargränssnitt.

Så, i grunden är tjänsten samma sak som aktiviteten, men den har ingen användargränssnittskomponent i den. Den behöver alltså inte utföra smidiga animationer med 60 fps. Det är därför den kan köras utföra vilken uppgift som helst under längre tid än aktiviteten.

Det finns tre typer av tjänster:

  • Startad tjänst – En tjänst startas när en programkomponent (t.ex. en aktivitet) anropar startService().
  • Bunden tjänst – En tjänst binds när en programkomponent binder till den genom att anropa bindService().
  • Schemalagd tjänst – En tjänst schemaläggs när ett API, t.ex. JobScheduler.

Bakgrunds- vs. förgrundsapplikationer:

För att lära oss hur bakgrundsexekveringen ändras måste vi först känna till skillnaden mellan bakgrunds- och förgrundsapplikation.

Tumregel: Din applikation betraktas som en förgrundstjänst om något av nedanstående tre fall är sant:

  1. Din applikation har för närvarande synlig aktivitet.
  2. Din applikation har en förgrundstjänst som körs.
  3. Din applikation är ansluten till en annan förgrundsapplikation genom att binda tjänsten eller genom att konsumera deras innehållsleverantörer.

Om något av ovanstående scenarier inte är sant i det aktuella fallet anses din applikation vara i bakgrunden.

Varför behöver vi begränsa användningen av bakgrundstjänster?

När dina applikationer körs i bakgrunden med hjälp av tjänster förbrukar din applikation två värdefulla resurser: 1) Minne och 2) Batteri.

Dessa två är begränsade resurser på mobila enheter och de flesta enheter i låg- och mellanklass har inte mycket minne eller batteri.

Som ditt program utför några mycket intensiva uppgifter i bakgrunden och använder en större mängd RAM-minne för att utföra den uppgiften, kommer detta att skapa en mycket skräpig användarupplevelse, särskilt om användaren använder en annan resurskrävande app, t.ex. spelar ett spel eller tittar på en video i förgrunden.

Enligt dokumentationen för den startade tjänsten är det bästa tillvägagångssättet,

När operationen är avslutad bör tjänsten stoppa sig själv.

Men många program har långvariga bakgrundstjänster, som i princip körs i oändlig tid för att antingen upprätthålla socket-anslutningen med servern eller för att övervaka vissa uppgifter eller användaraktivitet. Dessa tjänster orsakar batteridränering och förbrukar ständigt minne.

Från de senaste par utgåvorna av Android (med start från Marshmallow) försöker Google mycket hårt att öka batteritiden och minska minnesförbrukningen som används av programmen genom att införa doze-läget och app-standby genom att fördröja bakgrundsexekveringen med en viss tid om telefonen är inaktiv.

Men oftast använder utvecklarna dem ändå, trots att de känner till nackdelarna med de långkörande tjänsterna. (Mest för att det är lätt att genomföra och underhålla i stället för att använda andra lösningar.)