Az Android rendszer értesítési mechanizmusa folyamatosan fejlődik, és ahogy az operációs rendszer verziója egyre újabbá válik, úgy a fejlesztők számára egyre több lehetőség kínálkozik az értesítések testreszabására. A legegyszerűbb értesítésektől kezdve egészen a fejlettebb funkciókig, mint a különböző stílusok, hangok, rezgések, és akciógombok, az Android lehetőséget ad arra, hogy a felhasználói élmény még interaktívabbá és figyelemfelkeltőbbé váljon.

A legegyszerűbb értesítés elkészítése a következő lépéseken alapul: először is be kell állítanunk az értesítés ikonját és szövegét. Ez a két paraméter szükséges ahhoz, hogy az értesítés megjelenjen. Ha bármelyikük hiányzik, az értesítés nem fog látszani. Ezen kívül az értesítés létrehozása a NotificationCompat segítségével történik, amely az Android támogatási könyvtárában található, és biztosítja a backward compatibility-t, vagyis az alacsonyabb verziójú Android rendszerekkel való kompatibilitást. Ha egy olyan funkciót kérünk, amelyet a felhasználó operációs rendszere nem támogat, azt az OS figyelmen kívül hagyja.

Egy egyszerű értesítés kódja így nézhet ki:

java
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("LightsActionSoundRedux") .setContentText("Lights, Action & Sound");

Azonban nem szükséges, hogy csak ezek az alapfunkciók szerepeljenek az értesítésben. A rendszer számos további lehetőséget biztosít, például hangok, fények és rezgések hozzáadását. Például:

java
Uri notificationSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("LightsActionSoundRedux") .setContentText("Lights, Action & Sound") .setSound(notificationSoundUri) .setLights(Color.BLUE, 500, 500) .setVibrate(new long[]{250, 500, 250, 500, 250, 500});

A fenti kódban a setSound(), setLights() és setVibrate() metódusok adják hozzá a hangot, a fényt és a rezgést az értesítéshez. Fontos megjegyezni, hogy a rezgéshez ugyanazt a megfelelő engedélyt kell kérnünk, mint a korábbi példában, de itt már nem csupán a rezgés időtartamát adjuk meg, hanem egy rezgési mintát. A mintázat úgy működik, hogy az első érték az inaktív időszakot, míg a második az aktív, rezgő időszakot jelzi. Az aktív képernyővel rendelkező eszközök esetében az értesítés LED fényje nem fog megjelenni, ha a képernyő éppen be van kapcsolva.

Az értesítések egy másik fontos jellemzője az akciógombok hozzáadása. Az Android rendszer lehetőséget biztosít akár három akciógomb elhelyezésére is egy értesítésen belül az addAction() metódus segítségével. Az alábbi kód egy egyszerű értesítést mutat be, amely egy gombot tartalmaz:

java
Intent activityIntent = new Intent(this, MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, activityIntent, 0); notificationBuilder.addAction(android.R.drawable.ic_dialog_email, "Email", pendingIntent);

Ez az akciógomb egy szöveget és egy ikont tartalmaz, és amikor a felhasználó rákattint, akkor a hozzá tartozó PendingIntent aktiválódik, amely ebben az esetben az alkalmazás indítását jelenti. Az addAction() metódus három paramétert igényel: az ikont, a szöveget és a PendingIntent-et. A PendingIntent felelős azért, hogy az akciógomb megnyomásakor végrehajtott műveletet meghatározza.

A későbbi Android verziókban további lehetőségek is elérhetővé váltak az értesítések testreszabásában, mint például az “Expanded notifications” (kibővített értesítések). Az Android 4.1 (API 16) verzióval bevezetett kibővített értesítési stílusok három fő típust tartalmaznak: az InboxStyle, BigPictureStyle és BigTextStyle. Mindegyik stílus más módon jeleníti meg az értesítést, például a BigPictureStyle egy nagy képet jelenít meg, míg a BigTextStyle egy hosszú szöveget képes megjeleníteni. Az alábbiakban egy példát láthatunk arra, hogyan alkalmazhatóak ezek a stílusok:

java
NotificationCompat.Builder notificationBuilderBigPictureStyle = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("BigPictureStyle"); NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle(); bigPictureStyle.bigPicture(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)); notificationBuilderBigPictureStyle.setStyle(bigPictureStyle);

Ez a stílus lehetővé teszi, hogy a felhasználók nagy képeket láthassanak az értesítésekben, ami különösen hasznos lehet multimédiás alkalmazások esetén.

Végül, a legújabb Android verziók, mint az Android 5.0 (API 21) és újabbak, már támogatják az értesítések zárképernyőn történő megjelenítését. A setVisibility() metódus segítségével háromféle láthatóságot állíthatunk be: VISIBILITY_PUBLIC, amely minden tartalmat megjelenít; VISIBILITY_SECRET, amely minden tartalmat elrejt; és VISIBILITY_PRIVATE, amely csak az alapvető információkat (például címet és ikont) mutatja, míg a többit elrejti.

Mindezek a fejlettebb értesítési lehetőségek az alkalmazásokat még vonzóbbá és funkcionalitásban gazdagabbá teszik, hozzájárulva ezzel a jobb felhasználói élményhez. A különböző értesítési lehetőségek, mint a kibővített stílusok, akciógombok, valamint a hangok és rezgések hozzáadása mind segítenek abban, hogy a felhasználók a lehető legkényelmesebben és leginformatívabban értesüljenek az alkalmazásunkban történtekről.

Hogyan lehet figyelni a telefon állapotát és SMS-t küldeni Androidon?

Az Android alkalmazások fejlesztése során gyakran szükség van a telefon állapotának követésére, például a bejövő vagy kimenő hívások figyelésére, illetve SMS-ek küldésére. A PhoneStateListener osztály lehetővé teszi, hogy valós időben reagáljunk a telefon állapotváltozásaira, míg az SmsManager az SMS-ek küldéséhez nyújt egyszerű és hatékony megoldást.

A PhoneStateListener használata során az alkalmazás egy speciális hallgatót (listener) regisztrál a TelephonyManager osztályon keresztül, amely értesítést küld, ha a telefon állapota megváltozik. Ez lehet például hívás kezdet, bejövő hívás csörgése vagy hívás befejezése. A listener osztály onCallStateChanged metódusa kapja meg ezeket az eseményeket, ahol az aktuális állapot és az érintett telefonszám alapján lehet reagálni.

A gyakorlatban a legegyszerűbb megoldás, ha az alkalmazás felhasználói felületén egyetlen TextView-komponenst használunk az események megjelenítésére. A megfelelő jogosultságok (például READ_PHONE_STATE) megadása elengedhetetlen az Android Manifest fájlban, különben az alkalmazás nem kap hozzáférést a telefon állapotához.

Az SMS küldése hasonlóan egyszerű, bár itt fontos, hogy a megfelelő jogosultságokat is kezeljük dinamikusan a futási időben. Az alkalmazásnak engedélyt kell kérnie a SEND_SMS jogosultságra, amelyet a felhasználó elfogadhat vagy elutasíthat. Csak akkor engedélyezhető az SMS küldése, ha az engedély megvan. Maga az SMS küldése az SmsManager osztály sendTextMessage metódusával történik, ahol meg kell adni a címzett telefonszámát és az üzenet szövegét.

Az eseményfigyelés és az SMS küldés kódja a gyakorlatban tömör és hatékony, de figyelmet igényel a jogosultságok helyes kezelése, valamint az események megfelelő feldolgozása. A hívás állapotának pontos felismerése például megköveteli, hogy az egyes állapotokat (CALL_STATE_IDLE, CALL_STATE_RINGING, CALL_STATE_OFFHOOK) külön kezeljük, hiszen ezek jelentik a hívás különböző fázisait.

Fontos megérteni, hogy a TelephonyManager nem csupán a hívás állapotát képes figyelni, hanem egyéb eseményeket is, mint például az adatkapcsolat állapota, a jelerősség vagy a hívásátirányítási állapot. Ezekhez más listenerek tartoznak, melyekkel bonyolultabb funkciókat lehet megvalósítani, de a leggyakoribb alkalmazás mégis a hívásfigyelés.

Az SMS küldésénél a felhasználói élmény szempontjából lényeges, hogy megfelelő visszajelzést adjunk, ha a jogosultság hiányzik vagy az üzenetküldés sikertelen. Emellett a telefonon futó alkalmazásnak képesnek kell lennie a jogosultságok dinamikus kezelésére, ami különösen fontos a modern Android verziók esetén, ahol a felhasználók nagyobb kontrollt kaptak az engedélyek fölött.

A telefon állapotának és az SMS-ek kezelésének ismerete nem csak a fejlesztők számára hasznos, hanem azoknak is, akik mélyebben szeretnék megérteni, hogyan kommunikálnak az alkalmazások a telefon hardverével és az Android rendszerrel. Az események helyes kezelése és a jogosultságok megfelelő kezelése alapvető biztonsági és stabilitási követelmény.

Hogyan lehet lekérni az eszköz utolsó ismert helyzetét Android alkalmazásban?

Az utolsó ismert helyzet lekérése Android alkalmazásban egyszerű és hatékony módja annak, hogy a felhasználó pozícióját minimális erőforrás-felhasználással megkapjuk. Ez a megközelítés nem okoz jelentős akkumulátorhasználatot, mivel az alkalmazás nem kezeli folyamatosan a helyzetfrissítéseket, hanem a rendszer által tárolt legfrissebb helyadatot használja fel. Ehhez a Google Location API-k használata szükséges, amelyek beállítása a következő lépésekből áll.

Elsőként egy új projektet kell létrehozni Android Studio-ban, ahol a "Google Maps Activity" helyett az egyszerűbb "Empty Activity" kiválasztása javasolt a célhoz. A projektbe fel kell venni az alkalmazáshoz szükséges engedélyeket az Android Manifest fájlban, különösen az ACCESS_COARSE_LOCATION vagy pontosabb helyzethez az ACCESS_FINE_LOCATION jogosultságokat.

A felhasználói felület egyszerű, egy gomb és egy szövegmező elegendő. A gomb megnyomására történik a helyzet lekérése, melynek eredményét a TextView komponens jeleníti meg. A kód alapja a GoogleApiClient objektum létrehozása, amely a LocationServices API-t használja. Ennek felépítését a setupGoogleApiClient() metódus végzi, amely beállítja az API kapcsolatát és kezeli az állapotváltozásokat, mint a kapcsolat létrejötte vagy sikertelensége.

A helyzet lekéréséhez a getLastLocation() metódust hívjuk meg a FusedLocationApi-n keresztül. Ez a metódus visszaadja az utolsó ismert helyzetet, amennyiben az rendelkezésre áll. A helyadat tartalmazza a koordinátákat (szélesség, hosszúság) és az időbélyeget, amely megmutatja, mikor rögzítették az adott helyzetet. Mivel ez nem egy valós idejű helyzetfrissítés, a rendszer esetenként ugyanazt az adatot adja vissza ismétlődően, amíg új helyzet nem érkezik.

A helyzet pontosága a kért engedélyektől függ; az ACCESS_COARSE_LOCATION általános helyadatot ad, míg az ACCESS_FINE_LOCATION nagyobb pontosságot biztosít, de több erőforrást igényelhet. Fontos, hogy a helyzet lekérése előtt megfelelő jogosultságokat kell kezelni és kérni a felhasználótól, különösen az Android újabb verzióiban, amelyek futásidőben kérik az engedélyeket.

Az alkalmazás fejlesztése során a hibakezelés sem elhanyagolható. Ha a GoogleApiClient nem tud kapcsolódni, az OnConnectionFailedListener értesíti a fejlesztőt vagy felhasználót, például egy Toast üzenettel. Ez a megközelítés lehetővé teszi a kapcsolat állapotának figyelését és a hiba esetén való reagálást.

A helyzet tesztelése fizikai eszköz nélkül is megoldható az Android Studio beépített eszközeivel vagy a DDMS-zel, amelyek lehetőséget adnak a GPS koordináták szimulálására az emulátoron keresztül. Ez különösen fontos, mert a getLastLocation() nem mindig használ kizárólag GPS adatot, így a teszteléshez nem elég a mock GPS adatok küldése, hanem célszerű a helyzetfrissítéseket is szimulálni egyéb helyzetforrásokból.

Az utolsó ismert helyzet használata különösen hasznos olyan alkalmazásoknál, ahol nem szükséges folyamatos helyzetkövetés, hanem elegendő az adott pillanatban legfrissebb elérhető adat. Ez például geokódolási műveletek, helyalapú értesítések vagy egyszerű pozíció alapú funkciók esetén jelent előnyt.

A helyzet lekérésének és kezelésének mélyebb megértése elengedhetetlen a hatékony és felhasználóbarát helyalapú alkalmazások fejlesztéséhez. Az Android platform és a Google Play Services kínálta lehetőségek figyelmes alkalmazásával a fejlesztők képesek olyan megoldásokat készíteni, amelyek egyensúlyt teremtenek a pontosság, az erőforrás-felhasználás és a felhasználói élmény között.