Rady a tipy pro vyvojZkušenosti s android službou

Moderátor: mArtinko5MB

Odpovědět
Uživatelský avatar

Autor tohoto vlákna
d.aemon
Stálý androiďák
Příspěvky: 163
Registrován: čtv 19. kvě 2011 10:49:04
Reputace: 0
Typ mobilu / ROM: Nexus 5
Tablet: Nexus 10, Nexus 7, ASUS Transformer Pad 300
Bydliště: Okolí Brna
Kontaktovat uživatele:

Zkušenosti s android službou

Příspěvek od d.aemon » sob 11. črc 2015 17:01:27

Ahoj pánové,

peru se s podivným chováním služby a nevím, jestli něco dělám špatně, nebo to zkrátka nejde. Třeba se tu najde někdo zkušený, kdo ví, jak na to.

Mám službu, která typicky na vyžádání provádí nějakou práci na pozadí a zároveň se k ní dá připojit z aktivity přes bind. Když se přes bind připojím a nastartuju práci na pozadí přes metodu služby, která interně zavolá startService, a kde z onStartCommand vrátím START_STICKY, všechno běží fajn. Do té doby, než se zavolá z AlarmService stejná služba, jen s přidaným extra parametrem. Zavolá se znovu onStartCommand, provede se na pozadí, co má a zavolá se stopSelf s posledním startId. Jenže služba umře a zavolá se onDestroy, přestože se nikdy nezavolalo stopSelf s předešlým startId. A samozřejmě se nikde nevolá ani stopService.

Podle veškeré logiky by se služba takto chovat neměla. Nesetkal jste se s tím někdo?

Doufám, že se mi podařilo chování popsat dostatečně pochopitelně :D

UPDATE:
Pokud zakomentuju volání stopSelf s druhým startId, tak všechno funguje a služba se neshodí. Sice je to jakýsi workaround, ale nelíbí se mi, že systém eviduje několik běžících služeb, jejichž počet neustále narůstá, přestože nakrásně nic nedělají ani nežerou zdroje a jsou nastartované jen jako START_NOT_STICKY.



martinflorek
Androiďák!
Příspěvky: 481
Registrován: ned 05. čer 2011 7:04:44
Reputace: 7

Re: Zkušenosti s android službou

Příspěvek od martinflorek » pon 20. črc 2015 9:12:16

servis sa nenastartuje viac krat. vzdy bezi maximalne jeden, ked je to rovnaka trieda.

Uživatelský avatar

Autor tohoto vlákna
d.aemon
Stálý androiďák
Příspěvky: 163
Registrován: čtv 19. kvě 2011 10:49:04
Reputace: 0
Typ mobilu / ROM: Nexus 5
Tablet: Nexus 10, Nexus 7, ASUS Transformer Pad 300
Bydliště: Okolí Brna
Kontaktovat uživatele:

Re: Zkušenosti s android službou

Příspěvek od d.aemon » čtv 23. črc 2015 22:36:30

Samozřejmě, ale zavolat se může mnohokrát a právě proto má každé volání vlastní start ID. A pokud ukončím jeden start ID, nevidím důvod, proč by se měla služba ukončit a zavolat onDestroy. O to jde...


martinflorek
Androiďák!
Příspěvky: 481
Registrován: ned 05. čer 2011 7:04:44
Reputace: 7

Re: Zkušenosti s android službou

Příspěvek od martinflorek » sob 25. črc 2015 13:27:22

nechapem na co chces volat `stopSelf`. dokumentacia k tej metode hovori, ze servis sa ukonci, ak to zavolas s poslednym `startId`:
Be careful about ordering of your calls to this function.. If you call this function with the most-recently received ID before you have called it for previously received IDs, the service will be immediately stopped anyway. If you may end up processing IDs out of order (such as by dispatching them on separate threads), then you are responsible for stopping them in the same order you received them.
ak naozaj potrebujes zapinat/vypinat servis pocas behu aplikacie (imho zbytocne), tak si sprav vlastny "reference counting" v servise.

Uživatelský avatar

Autor tohoto vlákna
d.aemon
Stálý androiďák
Příspěvky: 163
Registrován: čtv 19. kvě 2011 10:49:04
Reputace: 0
Typ mobilu / ROM: Nexus 5
Tablet: Nexus 10, Nexus 7, ASUS Transformer Pad 300
Bydliště: Okolí Brna
Kontaktovat uživatele:

Re: Zkušenosti s android službou

Příspěvek od d.aemon » pon 27. črc 2015 19:08:53

Ou, díky za nakopnutí! Tak to dopadá, když člověk projde pár tutoriálů, ale nevěnuje pozornost dokumentaci. res. ne takovou, jakou si zaslouží. Tohle samozřejmě všechno vysvětluje.
Chtěl jsem volat stopSelf s každým start ID, protože jsem uvažoval jinak, než to ve skutečnosti funguje. Myslel jsem, že se drží každá běžící úloha, každý start služby, dokud se nezavolá stopSelf s odpovídajícím ID a k zastavení, resp. zavolání onDestroy dojde teprve až se ukončí všechny start ID.
Teď už je to jasné.
Ještě jednou díky ;)



mlendl
Nové Androidě
Příspěvky: 5
Registrován: stř 11. úno 2015 5:15:26
Reputace: 0
Typ mobilu / ROM: Huawei P7

Re: Zkušenosti s android službou

Příspěvek od mlendl » úte 12. dub 2016 10:47:53

...len jedna poznamka: bindovanie activity na service mi pripadalo vzdy take tazkopadne a vzdy som to dokazal jednoducho a prehladne vyriesit pomocou broadcastu prip. localneho broadcastu.

Uživatelský avatar

mka
Robot
Příspěvky: 1206
Registrován: pát 29. dub 2011 10:55:05
Reputace: 14
Typ mobilu / ROM: kde co
Kontaktovat uživatele:

Re: Zkušenosti s android službou

Příspěvek od mka » stř 13. dub 2016 15:12:15

Broadcating je v tomto případě ideální řešení...
Nepište mi PM, pokud to není vyloženě soukromé.
Nevěřte kdejaké hlouposti, byť by byla předkládána jako svatá pravda nejsvětější.

Odpovědět

Zpět na „Rady a tipy pro vyvoj“

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 0 hostů