Razvoj softvera za embeded sisteme Intents Intent Objekat
Razvoj softvera za embeded sisteme Intents
Intent Objekat za slanje poruka koji se koristi kako bi se uputio zahtev za akcijom drugoj komponenti aplikacije Postoje tri fundamentalno različita načina korišćenja intenta: intent za pokretanje aktivnosti, intent za pokretanje servisa, intent za broadcast poruke
Intent za pokretanje aktivnosti • Aktivnost predstavlja jedan ekran u aplikaciji • Nova aktivnost se pokreće prosleđivanjem Intent objekta metodi start. Activity() • Intent opisuje aktivnost koja se pokreće i prenosi joj neophodne podatke • Ukoliko je potrebno primiti rezultate od aktivnosti koja se pokreće, koristi se start. Activity. For. Result() callback funkcija. U ovom scenariju aktivnost prima rezultat kroz poseban Intent iz on. Activity. Result() callback funkcije
Intent za pokretanje servisa • Servis je komponenta koja je zadužena za izvršavanje operacija u pozadini, bez korisničkog interfejsa • Servis koji se jednom izvršava (npr. download fajla ) se pokreće sa prosleđivanjem Intent-a start. Service() metodi. Intent opisuje servis koji se pokreće i prenosi mu potrebne podatke • Za servise koji su dizajnirani kao klijent-server interfejsi, moguće je vezati (bind) servis sa nekom komponentom aplikacije prosleđivanjem Intenta metodi bind. Service()
Broadcast intenti • Broadcast je poruka koju bilo koja aplikacija može da primi • Sistem isporučuje raznorazne broadcast poruke za sistemske događaje, npr kada se sistem podiže, ili kada se baterija uređaja počinje puniti • Broadcast poruka se može poslati prosleđivanjem Intent-a metodi send. Broadcast(), send. Ordered. Broadcast() ili send. Sticky. Broadcast()
Tipovi Intent-a • Postoje dva tipa: 1. Eksplicitni Intenti kod kojih se komponenta koja se startuje navodi imenom (punim imenom klase). Obično se koriste kada se pokreće komponenta sopstvene aplikacije, jer u tom slučaju znamo ime aktivnosti ili servisa koji se pokreće 2. Implicitni Intenti ne navode ime komponente, a umesto njega navode generalnu akciju koju treba izvesti, što omogućava komponenti iz druge aplikacije da izvrše tu akciju (na primer ukoliko želimo prikazati lokaciju na mapi)
Tipovi intenta. . nastavak • Kada se kreira eksplicitni Intent za pokretanje aktivnosti ili servisa, sistem momentalno startuje komponentu specificiranu Intent objektom • Kada se kreira implicitni Intent, Android sistem pronalazi odgovarajuću komponentu tako što poredi sadržaj Intent-a sa Intent-filterima deklarisanim u okviru manifest fajla ostalih aplikacija na uređaju
Tipovi intenta. . nastavak • Ukoliko se pronađe samo jedna aplikacija kojoj se Intent-filter poklapa sa sadržajem Intent-a, ta aplikacija se pokreće i prosleđuje joj se Intent objekat • Ukoliko postoji više aplikacija sa Intentfilterima koji odgovaraju datom Intent-u, sistem prikazuje dijalog kako bi korisnik mogao da odabere aplikaciju koja će preuzeti njegov Intent
Intent-filter • Intent-filter je izraz koji se pojavljuje u manifest fajlu aplikacije i koji specificira tipove Intent-a koje ta aplikacija želi da preuzima • Deklarisanjem Intent-filtera za aktivnost, omogućava se ostalim aplikacijama da pokreću našu aktivnost korišćenjem Intenta određenog tipa • Ukoliko se ne deklariše nikakav Intent-filter za datu aktivnos, ona može biti pokrenuta isključivo korišćenjem eksplicitnog Intent-a
Implicitni Intent Aktivnost A kreira Intent sa opisom akcije koju treba izvesti i prosleđuje ga start. Activity() metodi Android sistem traži sve aplikacije sa intent-filterom koji se poklapaju sa Intentom Kada se pronađe odgovarajuća aktivnost (Aktivnost B) ona se pokreće on. Create() metodom kojoj se prosleđuje Intent
Kreiranje Intent-a • Intent objekti nose informacije koje Android sistem koristi da odredi koju komponentu treba startovati (aktivirati), kao i dodatne informacije koje ta komponenta treba da iskoristi kako bi uspešno izvršila svoju funkciju • Informacije sadržane u okviru Intent-a su: 1. 2. 3. 4. 5. 6. Ime komponente Akcija Podaci Kategorija Extras Flags
Ime komponente 1/2 • Ovo je opciono polje, ali polje koje definiše Intent kao eksplicitni • Bez imena, Intent je implicitni i sistem odlučuje koja komponenta treba da ga prihvati i obradi • Prilikom kreiranja servisa, uvek treba specificirati ime komponente, u suprotnom ne može se garantovati koji servis će odgovoriti na Intent, a korisnik ne može videti koji servis je pokrenut
Ime komponente. . 2/2 • Polje Intenta koje je zaduženo za ime je Component. Name koji može biti specificiran korišćenjem imena klase koje uključuje package, npr. com. example. Example. Activity • Ova komponenta se može postaviti korišćenjem metoda set. Component(), set. Class. Name() ili jednostavno konstruktorom Intent objekta
Akcija 1/3 • Predstavlja string koji specificira generičku akciju koju treba izvršiti (kao što je view ili pick) • Ova akcija u velikoj meri određuje strukturu ostatka Intent-a, posebno sadržaj dela podataka i extras • Korisnik može definisati sopstvene akcije koje će koristiti Intent-i u okviru njegove aplikacije (ili koje mogu koristiti druge aplikacije u cilju pozivanja komponenti iz te aplikacije), ali uglavnom treba koristiti konstante definisane klasom Intent
Akcije 2/3 • Neke uobičajene akcije za startovanje aktivnosti su: 1. ACTION_VIEW se koristi sa Intent-ima uz start. Activity() metodu, u slučaju kada postoje informacije koje aktivnost može da prikaže korisniku, kao naprimer fotografija 2. ACTION_SEND je takođe poznat kao “share” Intent i koristi se sa start. Activity() kada određene podatke korisnik može da koristi u drugim aplikacijama, npr email ili socijalne mreže
Akcije 3/3 • Dodatne akcije se mogu pronaći u Intent klasi • Akcija se definiše sa metodom set. Action() ili pri u konstruktoru Intent-a • Ukoliko se definišu sopstvene akcije, obavezno je uključiti package kao prefix, npr Static final String ACTION_TIMETRAVEL=“com. example. action. TIMETRAVEL”
Podaci 1/3 • URI (Uri objekat) koji referencira podatke koji se koriste i/ili MIME tip tih podataka • Sam tip podataka je generalno diktiran samom akcijom intent-a, npr. ako je akcija ACTION_EDIT, podaci obično sadrže URI dokumenta koji se edituje • Prilikom kreiranja intent-a važno je specificirati tip podataka (MIME tip) osim samog URI (npr. aktivnost koja prikazuje sliku verovatno neće biti u stanju da reprodukuje audio fajl, iako je URI možda sličan u oba slučaja
Podaci 2/3 • Definisanjem MIME tipa pomaže Android sistemu da pronađe najadekvatniju komponentu koja će preuzeti intent • U određenim slučajevima MIME tip je već predodređen na osnovu URI, na primer u slučaju content: URI, koji daje indikaciju da su podaci locirani na uređaju i da ih kontroliše Content. Provider (o kojima će biti reči naknadno)
Podaci 3/3 • Postavljanje samo URI podataka se vrši pomoću set. Data() metode • Postavljanje samo MIME tipa se vrši pomoću set. Type() metode • Ukoliko je potrebno pomoću set. Data. And. Type() metode se postavljaju oba i ako je potrebno postaviti oba to se radi samo ovako, a ne korišćenjem odvojeno prethodne dve metode (jer obe nuliraju ovu drugu)
Kategorija 1/2 • String koji sadrži dodatne informacije o vrsti komponente koja treba da prihvati intent • Proizvoljan broj kategorija može biti smešten u intent, ali većina intent-a ne zahteva kategoriju • Tipične kategorije su 1. CATEGORY_BROWSABLE: target aktivnost prihvata da bude startovana od strane web browser-a 2. CATEGORY_LAUNCHER: aktivnost sa ovom kategorijom je inicijalna aktivnost
Kategorija 2/2 • Ostale kategorije se mogu pronaći u klasi Intent • Kategorija se postavlja korišćenjem add. Category() metode
Extras 1/2 • Parovi (ključ, vrednost) koji nose dodatne informacije neophodne kako bi se izvršila zahtevana akcija • Dodaju se korišćenjem raznih put. Extra() metoda, pri čemu svaka prihvata dva parametra: ključ i vrednost • Takođe je moguće napraviti Bundle objekat sa svim dodatnim (Extras) podacima, a onda dodati ceo Bundle metodom put. Extras()
Extras 2/2 • Na primer, prilikom kreiranja intenta za slanje emaila pomoću ACTION_SEND, može se postaviti “to”primalac sa EXTRA_EMAIL ključem, kao i “subject” sa EXTRA_SUBJECT ključem • Intent klasa definiše mnogo EXTRA_* konstanti za standardizovane tipove podataka • Ukoliko je potrebno definisati sopstveni ključ, neophodno je uključiti package aplikacije kao prefix, npr: Static final String EXTRA_GIGAWATTS = “com. example. EXTRA_GIGAWATTS”;
Flags 1/2 • Flegovi definisani za Intent klasu koji se koriste kao meta-podaci Intent-a • Mogu da diriguju kako Android sistem pokreće aktivnost (npr. kom tasku pripada aktivnost) i kako je tretirati nakon pokretanja (npr. da li pripada listi prethodno korišćenih aktivnosti) • Koristi se set. Flags() metod
Primer eksplicitnog intent-a • Ukoliko je potrebno napraviti servis Download. Service, koji će prihvatiti fajl sa interneta, moguće je to uraditi kao: // Executed in an Activity, so 'this' is the Context // The file. Url is a string URL, such as "http: //www. example. com/image. png" Intent download. Intent = new Intent(this, Download. Service. class); download. Intent. set. Data(Uri. parse(file. Url)); start. Service(download. Intent); • Intent(Context, Class) konstruktor specificira da se Download. Service klasa korisi za servis
Primer implicitnog intent-a 1/3 • Ukoliko imamo sadržaj koji korisnik može da deli sa ostalim osobama, kreira se intent sa ACTION_SEND aksijom i dodaju se dodatni (extras) podaci koji određuju sadržaj • Pozivanjem start. Activity() metode sa tim intent-om, korisnik odabira aplikaciju kroz koju želi da podeli sadržaj • Treba biti oprezan u slučaju kada nema aplikacije koja može preuzeti intent. Metod resolve. Activity() na Intent objektu vraća null ako nema takve aplikacije, u suprotnom postoji bar jedna adekvatna aplikacija i bezbedno je pozvati start. Activity() metodu
Primer implicitnog intent-a 2/3 // Create the text message with a string Intent send. Intent = new Intent(); send. Intent. set. Action(Intent. ACTION_SEND); send. Intent. put. Extra(Intent. EXTRA_TEXT, text. Message); send. Intent. set. Type(HTTP. PLAIN_TEXT_TYPE); // "text/plain" MIME type // Verify that the intent will resolve to an activity if (send. Intent. resolve. Activity(get. Package. Manager()) != null) { start. Activity(send. Intent); } • U ovom slučaju URI se ne koristi, ali je tip podataka korišćen da specificira sadržaj extras
Primer implicitnog intent-a 3/3 • Prilikom pozivanja start. Activity() metode, sistem proverava sve instalirane aplikacije kako bi pronašao one koje mogu da manipulišu intent kome je postavljena akcija ACTION_SEND i koji sadrži “text/plain” podatke • Ako postoji samo jedna takva aplikacija odmah se pokreće, u suprotnom se prikazuje dijalog da bi korisnik mogao da odabere
Prihvatanje implicitnog intenta 1/3 • U cilju deklarisanja intent-a koje aplikacije može da prihvati, postavlja se jedan ili više intent-filtera za svaku od komponenti aplikacije korišćenjem <intentfilter> elementa u okviru manifest. xml fajla • Svaki intent filter deklariše tipove intenta koje prihvata bazirano na njihovoj akciji, podacima ili kategoriji • Sistem prosleđuje dati intent aplikaciji samo ako je intent prošao kroz barem jedan od filtera
Prihvatanje implicitnog intenta 2/3 • Aplikacija treba da deklariše zasebne filtere za svaki jedinstven zadatak koji može da obavlja • Na primer, aktivnost u okviru aplikacije galerije za prikaz i obradu slika treba da definiše dva filter-a. Kada je aktivnost pokrenuta, proverava se Intent i odlučuje se da li treba prikazati kontrole za editovanje slike nakon prikaza slike, ili ne
Prihvatanje implicitnog intenta 3/3 • U cilju prihvatanja implicitnog intenta, neophodno je uključiti i CATEGORY_DEFAULT kategoriju u okviru intent-filtera • Metode start. Activity() i start. Activity. For. Result() tretiraju sve intente kao da su deklarisali CATEGORY_DEFAULT kategoriju i ukoliko ona nije deklarisana u okviru filter-a nije moguće prihvatiti implicitni intent
PRIMER (intent-filter) <activity android: name="Share. Activity"> <intent-filter> <action android: name="android. intent. action. SEND"/> <category android: name="android. intent. category. DEFAULT"/> <data android: mime. Type="text/plain"/> </intent-filter> </activity> • Prihvatljivo je uključiti više od jedne instance action, data ili category
Intent filtri • Implicitni intent se testira as sva tri elementa intent-filtra i biće odbačen ako je barem jedan nezadovoljen • Obzirom da svaka komponenta može imati više intent-filtera intent će biti prihvaćen ako zadovolji neki drugi intent-filter, iako je zbog prethodnog bio odbačen
Intent filtri. . Primer 1/4 <activity android: name="Main. Activity"> <!-- This activity is the main entry, should appear in app launcher --> <intent-filter> <action android: name="android. intent. action. MAIN" /> <category android: name="android. intent. category. LAUNCHER" /> </intent-filter> </activity>
Intent filtri. . primer 2/4 <activity android: name="Share. Activity"> <!-- This activity handles "SEND" actions with text data --> <intent-filter> <action android: name="android. intent. action. SEND"/> <category android: name="android. intent. category. DEFAULT"/> <data android: mime. Type="text/plain"/> </intent-filter> <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data --> <intent-filter> <action android: name="android. intent. action. SEND"/> <action android: name="android. intent. action. SEND_MULTIPLE"/> <category android: name="android. intent. category. DEFAULT"/> <data android: mime. Type="application/vnd. google. panorama 360+jpg"/> <data android: mime. Type="image/*"/> <data android: mime. Type="video/*"/> </intent-filter> </activity>
Intent filtri. . Primer 3/4 • Prva aktivnost Main. Activity je ulazna tačka aplikacije, aktivnost koja se otvara kada korisnik pokrene aplikaciju: • Akcija ACTION_MAIN indicira da je ulazna tačka i ne očekuje nikakve podatke u okviru intenta • CATEGORY_LAUNCHER indicira da se ikonica ove aktivnosti koristi kao ikonica aplikacije. Ukoliko <activity> element ne specificira ikonicu pomoću icon, sistem koristi ikonicu <application> elementa • Ove dve moraju biti uparene kako bi se aktivnost pojavila u application launcher-u
Intent filtri. . Primer 4/4 • Druga aktivnost, Share. Activity je namenjena da omogući “share” teksta i medijskog sadržaja • Iako korisnici mogu pokrenuti ovu aktivnost iz Main. Activity aktivnosti, moguće je takođe pokrenuti je i direktno iz druge aplikacije koja zahteva implicitni intent koji se podudara sa jednim od dva definisana intent-filtra
Pending intent-i 1/2 • Ovo je wrapper oko Intent objekta i osnovna primena mu je da zatraži prava od ekterne aplikacije da koristi sadržani Intent kao da se izvršava iz sopstvenog procesa aplikacije • Primer bi bio deklarisanje Intenta koji će se izvršiti u nekon specificiranom trenutku u budućnosti od strane Android sistema i Alarm. Manager-a
Pending intent-i 2/2 • Mora biti kreiran sa obzirom na komponentu koja će ga koristiti (aktivnost, servis ili broadcast receiver) korišćenjem • Pending. Intent. get. Activity za Intent koji startuje Activity • Pending. Intent. get. Service za Intent koji startuje servis • Pending. Intent. get. Broadcast za Intent koji startuje Broadcast receiver-a
Dodatne informacije Za dodatne informacije o intentima uopšte (npr. načinu na koji se testiraju intent-filtri, provera komponenti koje mogu da izvrše dati intent i slično) mogu se naći na: https: //developer. android. com/guide/components/intents-filters. html
- Slides: 40