SZOFTVERFEJLESZTÉS ANDROID PLATFORMRA Dr. Iszály György Barna
KOMPONENSEK KÖZÖTTI KOMMUNIKÁCIÓ Minden Androidos alkalmazás a saját Dalvik virtuális gépén fut Így az alkalmazások elkülönülnek egymástól, biztosítva ezzel az adatok és processzek védelmét. Az alkalmazásainknak valamilyen módon kommunikálniuk kell egymással, Az intent elemek segítségével valósíthatjuk meg Az intent-ek az Intent osztály példányai Az intent események vagy műveletek absztrakt leírását tartalmazza Az intent közvetítése mindig az operációs rendszeren keresztül történik.
KOMPONENSEK HÍVÁSA A Context.startActivity() vagy Activity.startActivityForResult() csak Activity-k fogadhatják. A Context.startService() vagy Context.bindService() csak Service-ek fogadhatják. A Context.sendBroadcast(), Context.sendOrderedBroadcast() vagy Context.sendStickyBroadcast() csak broadcast reciever-ek fogadhatják. Az Android rendszer keresi meg az adott típusú intent-hez a fogadására képes komponenst Szükség esetén példányosítja és elindítja a komponenst, és átadja neki az információkat A meghívott komponens nem csak az adott alkalmazás eleme lehet, hanem bármilyen más alkalmazás modulja is. Saját alkalmazásainkat is fel tudjuk készíteni más alkalmazásokból küldött intent-ek fogadására.
INTENT OBJEKTUMOK Az intent objektum nem más, mint egy információs csomag Részei: Komponens név Annak a komponensnek a neve, amelynek kezelnie kell az intentet. Ez tulajdonképpen egy ComponentName osztály béli objektum, ami a célkomponens minősített osztálynevének (pl.: hu.nyf.pelda.app.peldaactivity) és a komponenst tartalmazó alkalmazás csomagnevének az együttese. Akció A bekövetkezett eseményt, vagy az általunk kiváltandó eseményt azonosítja. Az intent ezen része határozza meg, hogy milyen egyéb adat és extra mezők kapcsolódnak majd az intent-hez. Példaképen a leggyakoribb akciók közül: ACTION_CALL (célkomponens: activity) Egy hívást kezdeményez az adatmezőben átadott telefonszám irányába. ACTION_MAIN (célkomponens: activity) Elindítja a kezdő activity-t. Nincs se bemenő, se kimenő adata. ACTION_BATTERY_LOW (célkomponens: broadcast receiver) Az alacsony töltöttségi szintre figyelmeztet. ACTION_SCREEN_ON (célkomponens: broadcast receiver) A képernyőt bekapcsolták.
INTENT OBJEKTUMOK Adat Az eseményhez tartozó adat URI-jét és MIME28 típusát tartalmazza. Bár sok esetben az adat URI-jéből egyértelműen következik az adat típusa, mégis sok esetben nem csak az adat URI-jét, de az adat típusát is ismernünk kell, hogy helyesen kezeljük az intentet. Az adat típusát a MIME típussal adhatjuk meg. Az adatokra vonatkozó információkat mi magunk is beállíthatjuk és lekérdezhetjük a következő metódusokkal: setdata() az adat URI-jét adhatjuk meg vele settype() a MIME típus adható meg vele setdataandtype() az URI és MIME típus együtt adható meg vele getdata() az adat URI-je kérdezhető le vele gettype() az adat MIME típusa kérdezhető le vele
INTENT OBJEKTUMOK Kategória További információkat tartalmaz az intent-et feldolgozó komponens típusáról. Kategóriából egyszerre több is megadható. A kategóriák leírásai az intent osztályban lettek elhelyezve. Példa a kategóriákra: CATEGORY_HOME Ez az első activity, amely a rendszer indítása után végrehajtódik. CATEGORY_BROWSABLE Azoknak az alkalmazásoknak, melyek biztonságosan meghívhatóak a webböngészőkből, azoknak támogatniuk kell ezt. Extrák Olyan további kulcs-érték párokat tartalmaz, amelyeket az intent kezelő komponenshez kell eljuttatni. Ezekből akár több is lehet. A kulcs-érték párokat beállíthatjuk és visszaolvashatjuk a put () és get () metódusok sorozatával, de úgy is, mint egy Bundle objektumot, felhasználva a putextras() és getextras() metódusokat.
ACTIVITY INDÍTÁSA EXPLICIT INTENT A startactivity() metódussal Bemenő paraméter: Intent Explicit intent pontosan tudjuk melyik activity-t akarjuk meghívni Saját alkalmazásunk egy másik activity-jének meghívása az intent konstruktorában át kell adni az alkalmazás környezetet a getapplicationcontext() metódussal és az indítandó activity osztály nevét a class kiterjesztéssel. Más alkalmazásból való activity elindítása a külső alkalmazás pontos csomagnevét kell megadnunk az alkalmazás környezet attribútumaként
PÉLDA ACTIVITY INDÍTÁSÁRA Saját Activity indítása Intent relative_hivas=new Intent(getApplicationContext(), RelativeActivity.class); startactivity(relative_hivas); Külső Activity indítása Intent hivasextra=new Intent(); hivasextra.setaction(intent.action_send); hivasextra.setclassname("nyf.hu.animaciok", "nyf.hu.animaciok.animacioactivity"); hivasextra.putextra(intent.extra_text, "Ez az elküldött szöveg"); hivasextra.settype("text/plain"); startactivity(hivasextra);
ACTIVITY INDÍTÁSA IMPLICIT INTENT Nem kell pontosan tudnunk melyik alkalmazást akarjuk meghívni Azt kell tudnunk milyen akciót szeretnénk végrehajtatni alkalmazásunkkal Ilyenkor az elvárt akciót kell megadnunk kiegészítve a hozzá tartozó adatokkal Az Intent adat mezőjével Az Intent Extra Bundle-jének feltöltésével Az operációs rendszer fogja megkeresni számunkra a kérés kiszolgálásához legmegfelelőbb alkalmazást Ha nincs egyetlen megfelelő alkalmazás az ActivityNotFoundException kivételt eredményez Ha több lehetséges alkalmazás is a rendelkezésünkre áll, akkor a felhasználónak kell döntenie, hogy melyiket alkalmazza.
PÉLDA ACTIVITY INDÍTÁSÁRA Implicit Intenttel Intent fotokeszites=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startactivityforresult(fotokeszites, 1);
ACTIVITY INDÍTÁSA VISSZATÉRÉSI ÉRTÉKKEL startactivityforresult() - információval tér vissza a hívott alkalmazás befejeződése után Paraméterei: Intent Kérés azonosító egész szám A meghívott activity-ben a setresult() metódussal állíthatjuk be a visszaadandó adatokat. visszatérési kód RESULT_CANCELED RESULT_OK Intent objektum a visszaadandó adatokkal finish() metódus hívására az activity befejezi a működését A hívó oldalon az onactivityresult() metódussal dolgozhatjuk fel a visszaadott adatokat