Odeslat poptávku

Tipy pro Android: Jak trackovat polohu na pozadí a nenechat se zabít?

Trackování polohy na pozadí jsme v Dactylu řešili u několika aplikací. A protože řešení není vždycky úplně jednoduché, připravili jsme pár tipů, které se nám osvědčily v praxi. 
Pojďme na ně. 

Řešení pro nárazové trackování: WorkManager

Poloha na pozadí může být zaznamenávána více způsoby. Pokud je potřeba pouze nárazově, vyplatí se použít např. WorkManager, kterému můžete nastavit různá kritéria vykonání od periody po nutnost být připojený k internetu/energii. 
Nevýhodou může být minimální perioda 15 minut. Při neustálé potřebě něco vykonávat budete muset sáhnout po procesu na pozadí – Service.

Chce to flexibilnější řešení

Základní kámen pro úspěšný běh procesu na pozadí je Foreground Service. Jedná se o typ služby s nejvyšší prioritou, u které je nejnižší pravděpodobnost, že bude ukončena samotným systémem. 
Uživatele informuje o běhu připnutá notifikace. Od API 26 je nastavená pro běh na pozadí vyšší restrikce, kdy se klasické služby na pozadí ukončí po několika desítkách sekund běhu.

Podpora tohoto typu služby přišla také až od API 26 s příchozími restrikcemi. Při implementaci vlastní služby můžete příkazem  ContextCompat.startForegroundService(context, serviceIntent) určit, jakým způsobem podle verze API službu spustit. 

Zdroj obrázku: Medium.com

Ani špička pyramidy však nezaručí bezproblémový chod. Je vhodné implementovat vlastní detekci, zda byla aplikace ukončena neočekávaně (systémem), a při spuštění uživatele informovat, aby si v systému vypnul omezení běhu na pozadí. 

Problematické značky a zařízení 

Žebříček na webu Don't Kill My App informuje o značkách zařízení, kterých se tento problém týká nejvíc. Pokud se problém s ukončováním vyskytoval, uvolnění výkonnostních restrikcí aplikace v nastavení operačního systému ze strany uživatele ho posouvá téměř k dokonalosti.

Každý výrobce ukrývá nastavení restrikcí aplikace na jiném místě, proto je dobré pokrýt nejvíce problematické a rozšířené značky s postupy pro uživatele. My v Dactylu jsme měli největší problémy s Huawei, který i ve zmíněném žebříčku atakuje nejvyšší příčky.

Implementace

Při implementaci služby je potřeba přepsat několik metod. Jedna z nich je onStartCommand ,kde vrátíme jen hodnotu START_STICKY ,která pomůže restartovat službu při ukončení. 

Pro samotný záznam polohy se nám osvědčilo použití třídy FusedLocationProviderClient místo poskytovatele dat čistě z GPS využitím LocationManageru. Díky kombinaci více poskytovatelů polohy bylo prvotní určení polohy mnohem rychlejší, poté stabilnější a přesnější

Nastavení LocationRequestu pro zmíněný Provider nabízí několik parametrů. Provider poskytuje čtyři režimy, po jejich definováním bude distribuována lokace do callbacku onLocationResult.

Zajímavé řešení pro města

Ve městech byly zajímavé výsledky z úsporného PRIORITY_LOW_POWER, který pomocí používání pozic mobilních BTSek dokázal uspokojivě určovat polohu uživatele. Všechny režimy najdete v této dokumentaci.

Parametry interval a fastestInterval jsme definovali na stejné úrovni, definováním hodnoty Interval bez fastestInterval poskytoval systém horší dodržování nastavené periody. 

Šetříme uživateli baterku

Spotřebu energie sníží implementace BroadcastReceiver, kde je možné při nastavení akcí BluetoothDevice.ACTION_ACL_CONNECTED nebo BluetoothDevice.ACTION_ACL_DISCONNECTED do implementovaného rozhraní provolat zprávu, že dané spárované zařízení bylo připojeno, a tím reagovat změnou nastavení poskytovatele pozic, nebo záznam teprve při této akci zapínat.

Další užitečné články

PS: Nové články o vývoji vychází na našem Facebooku. Sledujte nás a získáte naše tipy z praxe.
PPS: Víte, že hledáme dactyláky do party?