Viszonylag pontos idozites Androidon

Fórumok

Udv,

Szuksegem lenne arra, hogy egy kodreszletet percenkent vegrehajtsak (1-2 masodperces pontosaggal), meg ha ki is lepnek az alkalmazasbol. 3 lehetosegeket talaltam, amivel idozeteni tudnek:

1. AlarmManager
Probaltam a setRepeating metodussal regisztralni az alarmot, de a 19-es API verzioval kezdodoen ez ugyanugy mukodik, mint a setInexactRepeating. Igy nem megbizhato az idozites. Akar 10 masodperces elterest is tapasztaltam. Esetleg hasznalni a setExact-ot, es percenkent ujraregisztralni az alarmot?

2. Sima IntentService
A kod vegrahajtasa utan betettem egy Thread.sleep(60000);. Igy viszonylag pontosan lefut percenkent a kod. A problema akkor van, ha a felhasznalo kilovi az alkalmazast a recent app listabol. Ez a folyamat ugy tunik nem feltetlen konzisztens a kulonbozo Android verziok kozott, de ujabb verziokon ugy tunik, hogy kilovi a sima Service-eket.

3. Foreground IntentService
Ez elvileg mukodne, de ehhez kell aktiv notification.

Mi a legjobb megoldas erre a celra?

A segitseget elore is koszonom.

Hozzászólások

Nem teljes a rálátásom, de a legtöbb app ami ilyen működésű volt, 4.2-ről 4.4-re átkerülve egy sticky notification mögé rejtette magát, gondolom háttéralkalmazások lelövöldözésre kerülnének. BatteryBar, Date in status bar, és pár hasonló kisebb alkalmazás is ezt választotta, nem mérvadóak, de tényleg csak ilyent láttam, alarm regisztráció régebbi verzióknál is csak "kérésnek" minősült, hogy mikor került meghívásra az az erőforrásoktól függöt.

Megjegyzem, nekem a sticky notification nem tetszik, foglalják a helyet a normális tartalom elől.

+1,a sticky notification idegesítő.

Mondjuk engem az is zavarna, ha egy app akkor is futni akar nagyonnagyon, ha a rendszer nem indítja el, mondjuk energia takarékossági okokból...

Ha meg nem ilyen piacra szánt app, akkor azt hiszem a sticky notification sem akadály
--
blogom

Nem akar nagyon-nagyon futni, csak akkor fog barmit is vegrehajtani, ha a felhasznalo aktivalja. Viszont ha aktivalja, akkor igenis fusson es vegezze a dolgat.
Viszont en szeretem a recent app listat uresen tartani, es ezt lattam masnal is a kornyezetemben. Ezert nem megfelelo a sima IntetnService, mert elegge haotikusan van kezelve, mikor a recent app listabol kidobnak egy alkalmazast.
Ugyanakkor a sticky notificationt en sem ertekelem tulsagosan, ezert is szeretnem kerulni.

Sic Transit Gloria Mundi

Tudom, hogy nem feltétlenül ezt szeretnéd, de tudsz kicsit mesélni a use-case-ről? Mi miatt kell ekkora pontosság?
Azért kérdezem, mert nem mindegy, hogy töltőre dugva, egy autóban, gyárban stb. céleszközre kell a megoldás, vagy konzumer termékbe...

------------------------
Everyone is a winner*

Nem tudom, hogy az 1-2 masodperc mennyire szamit nagy pontossagnak.
Egy egyszeru alkalmazasrol van szo, amelyben megtortenhet, hogy a felhasznalonak kell jelezni valamit percenkent. Ahogy en lattam eddig a setInexactRepeating mukodeset, ott megtortenhet, hogy 10-20 masodperc keses is elofordul. Ami elfogadhato lenne, hogy mondjuk max orankenti figyelmeztetes kellene. De ez percenkent mar 20-30%-os hibat jelent. Ami sok...

Sic Transit Gloria Mundi

"2. Sima IntentService
A kod vegrahajtasa utan betettem egy Thread.sleep(60000);. Igy viszonylag pontosan lefut percenkent a kod. A problema akkor van, ha a felhasznalo kilovi az alkalmazast a recent app listabol. Ez a folyamat ugy tunik nem feltetlen konzisztens a kulonbozo Android verziok kozott, de ujabb verziokon ugy tunik, hogy kilovi a sima Service-eket."

Én sima Service-t használtam start_sticky flaggel hasonló problémára, a periodikus futtatást pedig aservice-n belül egy Timer-rel oldottam meg.

Szerintem az, hogy egy háttérben futó és sticky flaggel ellátott servicet kilő az android, és nem indítja újra(!), az bug. innen kiindulva találsz némi infót. Szerencsére lehet "workaroundolni".

Nem jo dolog ilyet csinalni, nem veletlenul van inexantrepeating.
Hagyni kell a készüléket elmenni sleepbe, hadd kapcsolja ki a radio layert, hogy spóroljon az akksival. Ha te percenként csinálsz valamit, nem fog tudni aludni menni, és ez eléggé káros az akkura nézve.