Razvoj softvera za embeded sisteme Servisi Servisi Servis
Razvoj softvera za embeded sisteme Servisi
Servisi • • • Servis je aplikaciona komponenta koja može da obavlja dugotrajne operacije u pozadini Servis ne pruža korisnički interfejs (nema direktnu interakciju sa korisnikom) Druga aplikaciona komponenta može pokrenuti servis koji će nastaviti da radi u pozadini čak i ako se korisnik prebaci na drugu aplikaciju Komponenta može da se veže sa servisom i da vrši interprocesnu komunikaciju (IPC) - videćemo kasnije primer Na primer, servis se koristi da vrši mrežne transakcije, pušta muziku, obavlja I/O operacije, obezbeđuje interakciju sa bazom podataka, . . .
Servis se može naći u tri oblika : • Planiran • U ovom obliku se nalazi servis koji će biti pokrenut od strane specifinog API, kao što je npr. Job. Scheduler • Startovan • • Servis je startovan kada ga aplikaciona komponenta (kao što je Activity) startuje pozivanjem start. Service() Dovoljno je jednom da se aktivira, i servis može da radi u pozadini neograničeno, čak i ako je terminirana komponenta koja je aktivirala servis
Servis • Startovan • • Obično , startovan servis obavlja jednu operaciju i ne vraća rezultat inicijatoru Primer, preuzimanje ili slanje slike preko interneta, tek kada je operacija uspešno obavljena, servis treba da se zaustavi • Povezan • • Servis je Povezan (eng. "Bound") kada se aplikaciona komponenta vezuje za njega pozivom bind. Service() Bound servis nudi klijent - server interfejs koji omoguc ava komponente za interakciju sa servisom i koji radi na principu slanje zahteva, generisanje rezultata
Servis • Povezan • • • Povezan servis radi sve dok je aktivna neka druga aplikaciona komponenta za koju je vezan za servis Višestruke aplikacione komponente mogu biti vezane na jedan servis istovremeno, kada se sve aplikacione komponente odvoje (odjave), servis se potom uništava Iako dokumentacija odvojeno definiše startovane i povezane servise, servis može biti istovremeno i jedno i drugo (startovan da radi neograničeno dugo, a da ipak bude povezan)
Kreiranje servisa • • • Da bi se kreirao servis, potrebno je napraviti potklasu od klase Service ili koristiti neku od postojec ih podklasa) U implementaciji, potrebno je redefinisati callback metode koje se odnose na specifične događaje iz životnog veka servisa i metode koje obezbeđuju mehanizam za komponente da se vezuju na servis, ako je potrebno Najbitnije metode koje treba redefinisati su: • • on. Start. Command() on. Bind() on. Create() on. Destroy()
Kreiranje servisa on. Start. Command () • • • Sistem poziva ovaj metod , kada neka druga komponenta, kao što je Activity, traži da se pokrene servis , pozivom start. Service(). Kada je ova metoda izvršena, servis je počeo sa radom i može da radi u pozadini neograničeno Ako se koristi ovaj način za aktiviranje servisa, onda je odgovornost na programeru da zaustavi servis po obavljanju posla, bilo pozivom stop. Self() u okviru servisa ili stop. Service() Ukoliko je samo potrebno obezbediti povezivanje sa servisom, nije neophodno da se implementira ova metoda
Kreiranje servisa on. Bind() • • • Sistem poziva ovaj metod kada se druga aplikaciona komponenta treba povezati sa servisom (da bi, na primer, izvršila Remote. Procedure. Call ili RPC), pozivom metode bind. Service() U implementaciji ove metode, treba obezbediti interfejs tipa IBinder (komunikacioni kanal ka servisu) koji klijenti koriste za komunikaciju sa servisom, generisanje i vraćanje rezultata Neophodno je redefinisati ovaj metod, a ako ne želimo da dozvolimo povezivanje sa servisom, onda povratna vrednost metode treba da bude null
Kreiranje servisa on. Create() • Sistem poziva ovaj metod kada se prvi put stvorio servis i koristi se za inicijalizaciju (biće pozvan pre on. Start. Command() ili on. Bind() metoda) • Ako je servis vec pokrenut, ova metoda neće biti pozvana on. Destroy() • Sistem poziva ovaj metod kada se više ne koristi servis. Svaki servis treba da implementira ovu metodu radi oslobađanja resursa kao što su niti (threads), registrovani listeneri (listeners), prijemnici, itd.
Deklaracija servisa u Manifest-u • • Kao i Activity (i ostale komponente ), potrebno je deklarisati sve servise u Manifest fajlu Potrebno je dodati u manifest <service> element kao pod-element od <application> elementa. Na primer: <manifest. . . > . . . <application. . . > <service android: name=". Example. Service" /> . . . </application> </manifest>
Kreiranje startovanog servisa • • To je servis koji je startovan od strane druge komponente pozivom metode start. Service() Postoje dve klase koje se mogu nasleđivati u cilju implementacije startovanog servisa: Service Intent. Service
Startovan servis Service Ovo je osnovna klasa za sve servise. Kada se nasleđuje ova klasa, važno je da se kreira nova nit (thread) u kojoj se urade sve servisne operacije, jer servis inicijalno koristi glavnu nit aplikacije, što bi moglo da uspori funkcionisanje aplikacije Intent. Service je podklasa od klase Service, koja koristi radnu nit da obradi sve zahteve, jedan za drugim, pa je ovo najbolja opcija ako se ne zahteva da servis radi sa vec im brojem zahteva istovremeno. Sve što treba da se uradi jeste da se implementira on. Handle. Intent() metoda, koja prima Intent za svaki zahtev, nakon čega se vrši operacija u pozadini
Nasleđivanje Intent. Service klase • Ova klasa kreira radnu nit za izvršavanje svih namera (Intent-a) poslatih od strane on. Start. Command() • Kreira red iz kojeg se preuzima jedan po jedan Intent i prosleđuje metodi on. Handle. Intent() za obradu (tako da nema potrebe brinuti o multi-threadingu) • Zaustavlja servis posle obrade svih pristiglih zahteva, pa nema potrebe za pozivom metode stop. Self()
Nasleđivanje Intent. Service klase • Obezbeđuje inicijalnu implementaciju metode on. Bind() koja vraća vrednost null • Obezbeđuje inicijalnu implementaciju metode on. Start. Command() koja šalje Intent redu čekanja, a potom metodi on. Handle. Intent() • Ukoliko je potrebno da se šalje poruka od strane servisa aktivnosti koja je koristi, za to se moraju koristiti Broadcast poruke • Aktivnost tada, sa druge strane, mora koristiti Broadcast. Receiver kako bi prihvatila poslatu poruku i obradila je • Pogledajmo primer korišćenja Intent. Service klase
XML layout osnovne aktivnosti
Klasa nasleđena od Intent. Service
Main. Activity klasa 1/2
Main. Activity klasa 2/2
Manifest XML
Rad aplikacije
Pokretanje servisa • • • Startovanje servisa od strane Activity komponente ili druge aplikacione komponente prosleđivanjem Intent-a (u kojem se navodi koji servis treba da startuje) metodi start. Service() Android sistem poziva on. Start. Command() metod iz servisa i prosleđuje Intent (Nikada ne treba zvati on. Start. Command() direktno) Na primer, Activity može pokrenuti servis Hello. Sevice koristec i eksplicitno Intent korišćenjem metode start. Service() na sledeći način: Intent intent = new Intent(this, Hello. Service. class); start. Service(intent); • Start. Service() metod se završava odmah i Android sistem poziva on. Start. Command() metod servisa. Ako servis nije vec pokrenut, sistem prvo pozove on. Create(), a zatim poziva on. Start. Command()
Zaustavljanje servisa • • • Startovan servis treba da upravlja svojim životnim ciklusom Dakle, servise treba sam sebe da zaustavi pozivom metode stop. Self() ili neka druga komponenta aplikacije može zaustaviti prethodno startovan servis pozivom metode stop. Service() Dovoljno je jednom da se pošalje zahtev za prestanak rada servisa metodom stop. Self() ili stop. Service(), i sistem terminira servis što je pre moguc e More details: Managing the Lifecycle of a Service, Google.
Kreiranje povezanog servisa • • Povezan servis je servis koji dozvoljava aplikacionim komponentama da se vežu za servis pozivom metode bind. Service() u cilju stvaranja dugotrajne konekcije (i generalno ne dozvoljava da ga pokrenete pozivom start. Service()) Da bi se stvorio povezan servis, potrebno je implementirati on. Bind() callback metodu koje će da vrati objekat tipa IBinder, a koji definiše interfejs za komunikaciju sa servisom Ostale aplikativne komponente mogu pozvati bind. Service() metod kako bi preuzele interfejs i startovale pozivanje metoda iz servisa Servis živi samo da služi aplikativnim komponentama, u slučaju da nema povezane komponente sa servisom, sistem će terminirati servis • Pogledajmo primer povezanog servisa
XML layout osnovne aktivnosti
Klasa nasleđena od Service 1/2
Klasa nasleđena od Service 2/2
Objašnjenje • • • Bound. Service klasa je osnovna klasa sa kojom će se povezati aktivnost U ovom primeru, da bismo demonstrirali rad, u okviru ove klase kreiramo neograničeni tajmer i za to koristimo klasu Chronometer Vreme proteklo od kreiranja tajmera vraća se kroz public metodu get. Time. Stamp() Da bismo dobili na korišćenje objekat klase Bound. Service na kojem možemo pozvati metodu get. Time. Stamp(), kreiramo klasu My. Binder koja nasleđuje Binder (a koja implementira interfejs IBinder) Klasa My. Binder ima metodu koja vraća objekat Bound. Service klase (u ovom slučaju Bound. Service. this vraća this objekat klase u okviru koje je definisana klasa My. Binder (obratite pažnju da je klasa My. Binder definisana u okviru klase Bound. Service, te bi samo this vratilo objekat klase My. Binder)
Main. Activity klasa 1/3
Main. Activity klasa 2/3
Main. Activity klasa 3/3
Objašnjenje 1/3 • • • Main. Activity klasa startuje Bound. Service klasu i kasnije se povezuje sa njom Uvek kada se servis startuje ili se poveže sa njim, najpre se poziva on. Create() metoda, pa tek onda on. Start. Command() (ako je startovana) ili on. Bind() ako je povezana komponenta aplikacije sa datim servisom Nije neophodno startovati servis pre nego što se poveže sa njim Međutim, ako se poveže sa servisom koji nije prethodno startovan, on će biti aktivan samo dok je aktivna aplikaciona komponenta (aktivnost) koja je povezana sa njim Ako želimo da servis ostane aktivan i nakon toga, on se mora najpre startovati, pa se tek onda možemo povezati sa njim
Objašnjenje 2/3 • • Service. Connection klasa se koristi kako bi se uspostavila veza sa servisom, odnosno kako bi se aktivnost povezala sa servisom Kroz ovu klasu je vraćen objekat klase korišćenjem metode get. Service() Vraćeni objekat se koristi kad god je potrebno izvesti operaciju na servisu: u ovom slučaju get. Time. Stamp() metoda se poziva korišćenjem ove vraćene reference On. Unbind metod se mora koristiti pažljivo jer ukoliko to nije zadovoljeno, može doći do neželjenog ponašanja aplikacije
Objašnjenje 3/3 • • Tipično, on. Unbind se poziva kada aktivnost koja je povezana sa servisom pozove unbind. Service() metodu U zavisnosti od povratne vrednosti on. Unbind() metode, ako se ponovo vrši povezivanje sa servisom pozvaće se: 1. 2. • On. Rebind() umesto On. Bind() ako je ona true Ako je ona false, on. Bind() i on. Unbind() biće pozvani samo jednom – tj. Ako se vrši novo povezivanje nijedna od ove dve callback metode neće biti pozvana Dakle, ako želimo da bude pozivana metoda on. Rebind() prilikom narednih povezivanja sa servisom, a nakon što je servis obavešten da nijedna prethodno povezana komponenta (npr. aktivnost) više nije povezana, on. Unbind mora da vrati true
Manifest XML
Rad aplikacije
Životni vek servisa i odgovarajuće callback funkcije
- Slides: 36