Amikor egy alkalmazás a háttérben fut, a készülék korlátozott erőforrásainak egy részét, például a RAM-ot fogyasztja. Ez a felhasználói élmény romlásához vezethet, különösen, ha a felhasználó erőforrás-igényes alkalmazást használ, például játékot játszik vagy videót néz. A felhasználói élmény javítása érdekében az Android 8.0 (API 26. szint) korlátozza az alkalmazások háttérben futó tevékenységét. Ez a dokumentum ismerteti az operációs rendszer változásait, és azt, hogyan frissítheti az alkalmazását, hogy az új korlátozások mellett is jól működjön.
Mi a szolgáltatás az androidban?
Először frissítsük fel, mi a szolgáltatás az Androidban? Az android dokumentáció szerint:
A
Service
egy olyan alkalmazáskomponens, amely hosszú ideig futó műveleteket képes végrehajtani a háttérben, és nem biztosít felhasználói felületet.
A Service tehát alapvetően ugyanaz, mint az activity, de nincs benne UI komponens. Tehát nem kell sima animációt végeznie 60 fps sebességgel. Ezért képes hosszabb ideig bármilyen feladatot végrehajtani, mint az activity.
A szolgáltatásnak három típusa van:
- Indított szolgáltatás – A szolgáltatás akkor indul, amikor egy alkalmazáskomponens (például egy activity) hívja a
startService()
-t. - Kötött szolgáltatás – A szolgáltatás akkor kötődik, amikor egy alkalmazáskomponens a
bindService()
hívásával kötődik hozzá. - Scheduled Service – Egy szolgáltatás akkor kerül ütemezésre, amikor egy API, például a
JobScheduler.
Háttér vs. előtér alkalmazások:
A háttérben történő végrehajtás változásainak megismeréséhez először meg kell ismernünk a háttér és előtér alkalmazás közötti különbséget.
Ökölszabály, hogy az alkalmazásunk akkor tekinthető előtérben lévő szolgáltatásnak, ha az alábbi három eset bármelyike igaz:
- Az alkalmazásunknak jelenleg látható tevékenysége van.
- Az alkalmazásunk előtérben lévő szolgáltatása fut.
- Az alkalmazásunk egy másik előtérben lévő alkalmazáshoz kapcsolódik a szolgáltatás megkötésével vagy a tartalomszolgáltatóik fogyasztásával.
Ha a fenti forgatókönyvek bármelyike nem igaz az aktuális példányban, akkor az alkalmazás háttérben lévőnek tekinthető.
Miért kell korlátozni a háttérszolgáltatások használatát?
Amikor az alkalmazások a háttérben futnak a szolgáltatások használatával, az alkalmazás két értékes erőforrást fogyaszt: 1) Memóriát és 2) akkumulátort.
Ez a két erőforrás korlátozott a mobileszközökön, és a legtöbb alsó- és középkategóriás eszköz nem rendelkezik bőséges memóriával vagy akkumulátorral.
Tegyük fel, hogy az alkalmazás nagyon intenzív feladatokat végez a háttérben, és nagyobb mennyiségű RAM-ot használ a feladat elvégzéséhez, akkor ez nagyon rossz felhasználói élményt okoz, különösen, ha a felhasználó egy másik erőforrás-igényes alkalmazást használ, például játékot játszik vagy videót néz az előtérben.
Az indított szolgáltatás dokumentációja szerint a legjobb gyakorlat az,
Amikor a művelet befejeződik, a szolgáltatásnak le kell állítania magát.
De sok alkalmazásnak vannak hosszú ideig futó háttérszolgáltatásai, amelyek alapvetően a végtelenségig futnak, hogy vagy a kiszolgálóval való socket-kapcsolatot tartsák fenn, vagy bizonyos feladatokat vagy felhasználói tevékenységet figyeljék. Ezek a szolgáltatások az akkumulátor lemerüléséhez vezetnek, és folyamatosan fogyasztják a memóriát.
Az elmúlt néhány android kiadás óta (a Marshmallow-tól kezdve) a Google nagyon keményen próbálja növelni az akkumulátor élettartamát és csökkenteni az alkalmazások által használt memóriafogyasztást a doze mód és az alkalmazás készenléti állapotának bevezetésével, a háttérben történő végrehajtás bizonyos ideig történő késleltetésével, ha a telefon üresen van.
A legtöbbször azonban a fejlesztők a hosszú futású szolgáltatások hátrányainak ismerete ellenére még mindig használják őket. (Leginkább azért, mert könnyű megvalósítani és karbantartani, ahelyett, hogy más megoldásokat használnának.)
Vélemény, hozzászólás?