Broadcast-modtagere til begyndere

Lad os sige, at du har et program, der afhænger af en stabil internetforbindelse. Du ønsker, at din ansøgning bliver underrettet, når internetforbindelsen ændres. Hvordan gør du det? En mulig løsning ville være en tjeneste, der altid kontrollerer internetforbindelsen. Denne implementering er dårlig af forskellige grunde, så vi overvejer det ikke engang. Løsningen på dette problem er en Broadcast-modtager, og den vil lytte til de ændringer, du fortæller det til. En udsendelsesmodtager får altid besked om en udsendelse, uanset status for din ansøgning. Det betyder ikke noget, om din applikation i øjeblikket kører, i baggrunden eller slet ikke kører.

Baggrund

Broadcast-modtagere er komponenter i din Android-applikation, der lytter til udsendelsesmeddelelser (eller begivenheder) fra forskellige afsætningsmuligheder:

  • Fra andre applikationer
  • Fra selve systemet
  • Fra din ansøgning

Det betyder, at de påberåbes, når en bestemt handling er sket, som de er programmeret til at lytte til (IE, en udsendelse).

En udsendelse er simpelthen en besked indpakket inde i et Intent-objekt. En udsendelse kan enten være implicit eller eksplicit.

  • En implicit udsendelse er en, der ikke målretter mod din applikation specifikt, så den ikke er eksklusiv for din applikation. For at tilmelde dig en skal du bruge et IntentFilter og erklære det i dit manifest. Du skal gøre alt dette, fordi Android-operativsystemet gennemgår alle de erklærede hensigtsfiltre i dit manifest og ser, om der er et match. På grund af denne adfærd har implicitte udsendelser ikke en målattribut. Et eksempel på en implicit udsendelse ville være en handling af en indgående SMS-besked.
  • En eksplicit udsendelse er målrettet specifikt til din applikation på en komponent, der er kendt på forhånd. Dette sker på grund af målattributten, der indeholder programmets pakkenavn eller et komponentklassenavn.

Der er to måder at erklære en modtager på:

  1. Ved at erklære en i din AndroidManifest.xml-fil med tagget (også kaldet statisk)

Du vil bemærke, at den ovenfor nævnte udsendelsesmodtager har en egenskab eksporteret = ”sand” . Denne attribut fortæller modtageren, at den kan modtage udsendelser uden for anvendelsesområdet.

2. Eller dynamisk ved at registrere en forekomst hos registerReceiver (hvad der kaldes kontekstregistreret)

public abstract Intent registerReceiver (BroadcastReceiver receiver, IntentFilter filter);

Implementering

For at oprette din egen broadcast-modtager skal du først udvide BroadcastReceiver-forældreklassen og tilsidesætte den obligatoriske metode, onReceive:

public void onReceive(Context context, Intent intent) { //Implement your logic here }

At sætte det hele giver:

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(); } }
R️ Metoden onReceive kører på hovedtråden, og på grund af dette skal dens udførelse være kort.

Hvis en lang proces udføres, kan systemet muligvis dræbe processen, når metoden vender tilbage. For at omgå dette skal du overveje at bruge goAsync eller planlægge et job. Du kan læse mere om planlægning af et job i bunden af ​​denne artikel.

Eksempel på dynamisk registrering

For at registrere en modtager med en kontekst skal du først instantiere en forekomst af din tv-modtager:

BroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();

Derefter kan du registrere det afhængigt af den specifikke kontekst, du ønsker:

IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); this.registerReceiver(myBroadcastReceiver, filter);

Glem ikke at afmelde din radiomodtager, når du ikke længere har brug for det

@Override protected void onStop() { super.onStop(); unregisterReceiver(myBroadcastReceiver); }

Broadcasting en begivenhed

Pointen bag udsendelse af meddelelser fra din applikation er at lade din applikation svare på begivenheder, når de sker inde i den. Tænk på et scenarie, hvor brugeren i en del af koden udfører en bestemt handling, og på grund af det vil du udføre en anden logik, du har et andet sted.

Der er tre måder at sende udsendelser på:

  1. den sendOrderedBroadcastmetode, sørger for kun at sende udsendelser til en modtager ad gangen. Hver udsendelse kan igen videregive data til den, der følger den, eller for at stoppe udbredelsen af ​​udsendelsen til de modtagere, der følger
  2. Den sendBroadcast svarer til den ovenfor nævnte fremgangsmåde, med en forskel. Alle udsendelsesmodtagere modtager beskeden og er ikke afhængige af hinanden
  3. LocalBroadcastManager.sendBroadcast- metoden sender kun udsendelser til modtagere, der er defineret i din applikation og overstiger ikke anvendelsesområdet for din applikation . Eksempel på afsendelse af en tilpasset udsendelse

//giphy.com/gifs/23gUJhHyWkXEwl7UYV/html5

Gotchas og ting at være opmærksom på

  • Send ikke følsomme data gennem en implicit udsendelse, for enhver applikation, der lytter til det, modtager det. Du kan forhindre dette ved enten at angive en pakke eller vedhæfte en tilladelse til udsendelsen
  • Start ikke aktiviteter fra en modtaget udsendelse, da brugeroplevelsen mangler. Vælg at vise en underretning i stedet.

De følgende punkter refererer til ændringer i udsendelsesmodtagere, der er relevante for hver Android OS-version (startende fra 7.0). For hver version har visse begrænsninger taget plads, og adfærd har også ændret sig. Husk disse begrænsninger, når du overvejer at bruge en radiomodtager.

  • 7.0 og op (API-niveau 24) - To systemudsendelser er blevet deaktiveret, Action_New_Picture og Action_New_Video (men de blev bragt tilbage i Android O til registrerede modtagere)
  • 8.0 og op (API-niveau 26) - De fleste implicitte udsendelser skal registreres dynamisk og ikke statisk (i dit manifest). Du kan finde de udsendelser, der blev hvidlistet i dette link.
  • 9.0 og op (API-niveau 28) - Mindre information modtaget om Wi-Fi-systemudsendelse og Network_State_Changed_Action.

Ændringerne i Android O er dem, du skal være mest opmærksom på. Årsagen til, at disse ændringer blev foretaget, var fordi det førte til ydeevneproblemer, udtømning af batteri og skadet brugeroplevelse. Dette skete, fordi mange applikationer (selv dem, der ikke kører i øjeblikket) lyttede til en systemomfattende ændring, og da denne ændring skete, opstod der kaos. Forestil dig, at enhver ansøgning, der er registreret til handlingen, blev levende til at kontrollere, om den havde brug for at gøre noget på grund af udsendelsen. Tag noget i betragtning som Wi-Fi-tilstanden, som ændres ofte, og du begynder at forstå, hvorfor disse ændringer fandt sted.

Alternativer til Broadcast-modtagere

For at gøre det nemmere at navigere i alle disse begrænsninger er nedenfor en oversigt over andre komponenter, du kan bruge i fravær af en udsendelsesmodtager. Hver enkelt har et andet ansvar og en anden anvendelse, så prøv at kortlægge, hvilken der passer til dine behov.

  • LocalBroadcastManager - Som jeg nævnte ovenfor, er dette kun gyldigt for udsendelser inden for din applikation
  • Planlægning af et job - Et job kan køres afhængigt af et modtaget signal eller en trigger, så du kan finde ud af, at den udsendelse, du lyttede til, kan erstattes af et job. Desuden er denJobScheduler, garanterer, at dit job er færdigt, men det vil tage højde for forskellige systemfaktorer (tid og betingelser) for at bestemme, hvornår det skal køre. Når du opretter et job, tilsidesætter du en metode kaldet onStartJob . Denne metode kører på hovedtråden, så sørg for at den afslutter sit arbejde på en begrænset tid. Hvis du har brug for at udføre kompleks logik, skal du overveje at starte en baggrundsopgave. Desuden er returværdien for denne metode en boolsk, hvor sand angiver, at visse handlinger stadig udføres, og falsk betyder, at jobbet er udført

Hvis du vil opleve førstehånds glæden og undren, der er udsendelsesmodtagere, kan du følge disse links til opbevaringssteder, som jeg har oprettet:

  1. Custom Broadcast (med manifesterklæring)
  2. Registrering af Broadcast (uden at erklære en i manifestet)
  3. LocalBroadcastManager

Broadcast over.