Műsorszóró vevők kezdőknek

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:

  1. 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:

  1. 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
  2. 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
  3. 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:

  1. Egyéni közvetítés (nyilvánvaló nyilatkozattal)
  2. Broadcast regisztrálása (anélkül, hogy a jegyzékbe bejelezné)
  3. LocalBroadcastManager

Adás vége.