Tegyük fel, hogy van olyan alkalmazása, amely a folyamatos internetkapcsolattól függ. Azt szeretné, hogy az alkalmazás értesítést kapjon az internetkapcsolat változásakor. Hogyan csinálod, hogy? Lehetséges megoldás egy olyan szolgáltatás, amely mindig ellenőrzi az internetkapcsolatot. Ez a megvalósítás különböző okokból rossz, ezért nem is vesszük figyelembe. A probléma megoldása egy Broadcast Receiver, amely meghallgatja azokat a változásokat, amelyekre utasítja. A sugárzott vevő mindig értesítést kap a műsorról, függetlenül az alkalmazás állapotától. Nem számít, hogy az alkalmazás jelenleg fut-e, a háttérben vagy egyáltalán nem fut-e.
Háttér
A műsorszóró vevők az Android-alkalmazás olyan összetevői, amelyek különböző terjesztési helyekről hallgatják a sugárzott üzeneteket (vagy eseményeket):
- Más alkalmazásokból
- Magától a rendszertől
- Az Ön alkalmazásából
Ez azt jelenti, hogy akkor hívják meg őket, amikor egy bizonyos művelet megtörtént, amelyet meghallgatásra programoztak (IE, adás).
A közvetítés egyszerűen egy Intent objektum belsejébe csomagolt üzenet. A közvetítés lehet implicit vagy explicit.
- Az implicit sugárzás az, amely nem kifejezetten az Ön alkalmazását célozza, tehát nem kizárólag az Ön alkalmazására vonatkozik. Az egyikhez való regisztrációhoz használnia kell egy IntentFiltert, és nyilatkoznia kell róla a nyilvántartásában. Mindezt meg kell tennie, mert az Android operációs rendszer átmegy az összes deklarált szándékszűrőn a jegyzékben, és megnézi, hogy van-e egyezés. Ezen viselkedés miatt az implicit sugárzások nem rendelkeznek célattribútummal. Az implicit közvetítésre példa lehet egy bejövő SMS üzenet művelete.
- A kifejezett sugárzás olyan, amely kifejezetten az alkalmazásod számára van megcélozva egy előre ismert összetevőn. Ez annak a célattribútumnak köszönhető, amely tartalmazza az alkalmazás csomagnevét vagy egy összetevő osztály nevét.
Kétféleképpen lehet deklarálni a vevőt:
- Ha deklarál egyet az AndroidManifest.xml fájlban a címkével (statikusnak is nevezik)
Észre fogja venni, hogy a fent deklarált sugárzó vevő exportált = "true" tulajdonsággal rendelkezik . Ez az attribútum közli a vevővel, hogy az alkalmazás hatókörén kívülről is fogadhat adásokat.
2. Vagy dinamikusan, ha regisztrál egy példányt a registerReceiver (más néven kontextusban regisztrált) regisztrációval.
public abstract Intent registerReceiver (BroadcastReceiver receiver, IntentFilter filter);
Végrehajtás
Saját adás vevő létrehozásához először ki kell terjesztenie a BroadcastReceiver szülőosztályt, és felül kell írnia az onReceive kötelező metódust:
public void onReceive(Context context, Intent intent) { //Implement your logic here }
Az egészet összerakva:
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { StringBuilder sb = new StringBuilder(); sb.append("Action: " + intent.getAction() + "\n"); sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n"); String log = sb.toString(); Toast.makeText(context, log, Toast.LENGTH_LONG).show(); } }
⚠️Az onReceive metódus a fő szálon fut, és emiatt a végrehajtásának rövidnek kell lennie.
Hosszú folyamat végrehajtása esetén a rendszer a módszer visszatérése után megöli a folyamatot. Ennek megkerüléséhez fontolja meg a goAsync használatát vagy a munka ütemezését. A munka ütemezéséről a cikk alján olvashat bővebben.
Dinamikus regisztráció példa
A vevő regisztrációjához regisztrációval először példányt kell készítenie a sugárzott vevőből:
BroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();
Ezután regisztrálhatja a kívánt kontextustól függően:
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); this.registerReceiver(myBroadcastReceiver, filter);
Ne felejtse el törölni a vevő regisztrációját, amikor már nincs rá szüksége
@Override protected void onStop() { super.onStop(); unregisterReceiver(myBroadcastReceiver); }
Esemény közvetítése
Az alkalmazás üzeneteinek közvetítése mögött az a lényeg, hogy lehetővé tegye az alkalmazás számára, hogy reagáljon az eseményekre, ahogy azok az alkalmazás belsejében történnek. Gondoljon egy olyan forgatókönyvre, ahol a kód egyik részében a felhasználó végrehajt egy bizonyos műveletet, és emiatt valamilyen más logikát szeretne végrehajtani, amelyet egy másik helyen használ.
Háromféle módon küldhet adásokat:
- A sendOrderedBroadcastmódszerrel, gondoskodik arról, hogy az adásokat egyszerre csak egy vevőnek küldje. Minden adás viszont továbbíthatja az adatokat az azt követőnek, vagy leállíthatja az adás terjedését az azt követő vevőknek
- A sendBroadcast hasonló a fent említett módszerhez, egy különbséggel. Minden műsorvevő fogadja az üzenetet, és nem függ egymástól
- A LocalBroadcastManager.sendBroadcast módszer csak az alkalmazáson belül meghatározott vevőknek küld adásokat, és nem lépi túl az alkalmazás hatókörét. Példa egyéni adás küldésére
//giphy.com/gifs/23gUJhHyWkXEwl7UYV/html5

Gotchák és a figyelmet igénylő dolgok
- Ne küldjön érzékeny adatokat implicit közvetítés útján, mert minden alkalmazás, amely rájuk hallgat, megkapja. Ezt megakadályozhatja egy csomag megadásával, vagy egy engedély csatolásával a közvetítéshez
- Ne kezdje a tevékenységeket egy fogadott adásból, mivel a felhasználói élmény hiányzik. Ehelyett válassza az értesítés megjelenítését.
A következő felsorolás az adás vevőinek változásaira vonatkozik, amelyek az egyes Android OS verziókra vonatkoznak (7.0-tól kezdődően). Az egyes verzióknál bizonyos korlátozások léptek fel, és a viselkedés is megváltozott. Tartsa szem előtt ezeket a korlátozásokat, amikor a vevő használatára gondol.
- 7.0 és újabb (API 24. szint) - Két rendszerközvetítést letiltottak, az Action_New_Picture és az Action_New_Video programokat (de a regisztrált vevők számára az Android O-ban hozták vissza őket)
- 8.0 és újabb (API 26. szint) - A legtöbb implicit adást dinamikusan és nem statikusan kell regisztrálni (a jegyzékben). Ezen a linken megtalálhatja azokat az adásokat, amelyeket engedélyezőlistára tett.
- 9.0 és újabb (API 28. szint) - Kevesebb információ érkezik a Wi-Fi rendszer sugárzásáról és a Network_State_Changed_Action műveletről.
Az Android O változásaival kell leginkább tisztában lennie. Azért hajtották végre ezeket a módosításokat, mert teljesítményproblémákhoz, az akkumulátor lemerüléséhez és a felhasználói élmény károsodásához vezetett. Ez azért történt, mert sok alkalmazás (még azok is, amelyek jelenleg nem futnak) rendszerszintű változásra hallgattak, és amikor ez a változás bekövetkezett, káosz alakult ki. Képzelje el, hogy minden akcióra regisztrált alkalmazás életre kel, hogy ellenőrizze, szükség van-e valamire a közvetítés miatt. Vegye figyelembe a Wi-Fi állapotát, amely gyakran változik, és meg fogja érteni, miért történtek ezek a változások.
A műsorszóró vevők alternatívái
A korlátozások közötti könnyebb eligazodás érdekében az alábbiakban bemutatjuk az egyéb összetevőket, amelyeket sugárzó vevő hiányában használhat. Mindegyiküknek más a felelőssége és a felhasználási esete, ezért próbálja feltérképezni, melyik felel meg az Ön igényeinek.
- LocalBroadcastManager - Mint fent említettem, ez csak az alkalmazáson belüli adásokra érvényes
- Munka ütemezése - Egy munka futtatható a kapott jeltől vagy triggertől függően, így előfordulhat, hogy a hallgatott közvetítést helyettesítheti egy munka. Továbbá aA JobScheduler garantálja, hogy a munkája befejeződik, de figyelembe veszi a rendszer különböző tényezőit (időt és körülményeket) annak meghatározásához, hogy mikor kell futnia. Munka létrehozásakor felülírja az onStartJob nevű metódust . Ez a módszer a fő szálon fut, ezért győződjön meg arról, hogy korlátozott idő alatt fejezi be a munkáját. Ha összetett logikát kell végrehajtania, fontolja meg egy háttérfeladat elindítását. Ezenkívül a módszer visszatérési értéke logikai érték, ahol az true azt jelzi, hogy bizonyos műveleteket még mindig végrehajtanak, a hamis pedig azt jelenti, hogy a feladat elkészült
Ha első kézből szeretné megtapasztalni a vevőkészülékek örömét és csodáját, kövesse ezeket a linkeket az általam létrehozott tárakhoz:
- Egyéni közvetítés (nyilvánvaló nyilatkozattal)
- Broadcast regisztrálása (anélkül, hogy a jegyzékbe bejelezné)
- LocalBroadcastManager
Adás vége.