Android - odbiorniki transmisji

Broadcast Receivers po prostu odpowiadaj na wiadomości nadawane z innych aplikacji lub z samego systemu. Te wiadomości są czasami nazywane wydarzeniami lub intencjami. Na przykład aplikacje mogą również inicjować rozgłaszanie, aby poinformować inne aplikacje, że niektóre dane zostały pobrane do urządzenia i są dostępne dla nich do użycia, więc jest to odbiornik rozgłoszeniowy, który przechwyci tę komunikację i zainicjuje odpowiednią akcję.

Istnieją dwa ważne kroki, aby BroadcastReceiver działał zgodnie z intencjami nadawanymi przez system -

  • Tworzenie odbiornika transmisji.

  • Rejestracja odbiorcy transmisji

Jeśli zamierzasz wdrożyć swoje niestandardowe intencje, musisz wykonać jeden dodatkowy krok, a następnie musisz utworzyć i rozpowszechnić te zamiary.

Tworzenie odbiornika transmisji

Odbiornik rozgłoszeniowy jest zaimplementowany jako podklasa BroadcastReceiver i przesłaniając metodę onReceive (), w której każdy komunikat jest odbierany jako plik Intent parametr obiektu.

public class MyReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent intent) {
      Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
   }
}

Rejestracja odbiorcy transmisji

Aplikacja nasłuchuje określonych intencji emisji, rejestrując odbiornik emisji w pliku AndroidManifest.xml . Weź pod uwagę, że zamierzamy zarejestrować MyReceiver dla zdarzenia ACTION_BOOT_COMPLETED wygenerowanego przez system, które jest uruchamiane przez system po zakończeniu procesu uruchamiania systemu Android.

Odbiornik transmisji

<application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >
   <receiver android:name="MyReceiver">
   
      <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED">
         </action>
      </intent-filter>
   
   </receiver>
</application>

Teraz, gdy urządzenie z Androidem zostanie uruchomione, zostanie przechwycone przez BroadcastReceiver MyReceiver i zaimplementowana logika wewnątrz onReceive () zostanie wykonana.

Istnieje kilka zdarzeń generowanych przez system zdefiniowanych jako końcowe pola statyczne w pliku Intentklasa. W poniższej tabeli wymieniono kilka ważnych zdarzeń systemowych.

Sr.No Stała i opis zdarzenia
1

android.intent.action.BATTERY_CHANGED

Przyklejona transmisja zawierająca stan naładowania, poziom i inne informacje o baterii.

2

android.intent.action.BATTERY_LOW

Wskazuje niski stan baterii urządzenia.

3

android.intent.action.BATTERY_OKAY

Wskazuje, że bateria jest teraz w porządku po niskim poziomie.

4

android.intent.action.BOOT_COMPLETED

Jest to nadawane raz, po zakończeniu uruchamiania systemu.

5

android.intent.action.BUG_REPORT

Pokaż aktywność dotyczącą zgłaszania błędu.

6

android.intent.action.CALL

Wykonaj połączenie z kimś określonym w danych.

7

android.intent.action.CALL_BUTTON

Użytkownik nacisnął przycisk „zadzwoń”, aby przejść do dialera lub innego odpowiedniego interfejsu użytkownika w celu wykonania połączenia.

8

android.intent.action.DATE_CHANGED

Data się zmieniła.

9

android.intent.action.REBOOT

Uruchom ponownie urządzenie.

Nadawanie niestandardowych zamiarów

Jeśli chcesz, aby Twoja aplikacja sama generowała i wysyłała niestandardowe intencje, będziesz musiał utworzyć i wysłać te intencje za pomocą metody sendBroadcast () wewnątrz klasy aktywności. Jeśli używasz metody sendStickyBroadcast (Intent) , Intent jeststicky, co oznacza, że intencja, którą wysyłasz, pozostaje w pobliżu po zakończeniu transmisji.

public void broadcastIntent(View view) {
   Intent intent = new Intent();
   intent.setAction("com.tutorialspoint.CUSTOM_INTENT");
   sendBroadcast(intent);
}

Ta intencja com.tutorialspoint.CUSTOM_INTENT może być również zarejestrowana w podobny sposób, jak zarejestrowaliśmy intencję wygenerowaną przez system.

<application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >
   <receiver android:name="MyReceiver">
   
      <intent-filter>
         <action android:name="com.tutorialspoint.CUSTOM_INTENT">
         </action>
      </intent-filter>
   
   </receiver>
</application>

Przykład

Ten przykład wyjaśnia, jak utworzyć BroadcastReceiver, aby przechwycić niestandardowe intencje. Gdy zaznajomisz się z intencjami niestandardowymi, możesz zaprogramować aplikację tak, aby przechwytywała intencje generowane przez system. Wykonajmy więc następujące kroki, aby zmodyfikować aplikację na Androida, którą stworzyliśmy w rozdziale Hello World Example -

Krok Opis
1 Użyjesz Android Studio do stworzenia aplikacji na Androida i nazwij ją jako Moja aplikacja w pakiecie com.example.tutorialspoint7.myapplication, jak wyjaśniono w rozdziale Hello World Example .
2 Zmodyfikuj główny plik aktywności MainActivity.java, aby dodać metodę broadcastIntent () .
3 Utwórz nowy plik java o nazwie MyReceiver.java w pakiecie com.example.tutorialspoint7.myapplication, aby zdefiniować BroadcastReceiver.
4 Aplikacja może bez żadnych ograniczeń obsługiwać jeden lub więcej celów niestandardowych i systemowych. Każda intencja, którą chcesz przechwycić, musi zostać zarejestrowana w pliku AndroidManifest.xml za pomocą tagu <receiver ... />
5 Zmodyfikuj domyślną zawartość pliku res / layout / activity_main.xml , tak aby zawierał przycisk do rozpowszechniania intencji.
6 Nie ma potrzeby modyfikowania pliku string, Android Studio zajmuje się plikiem string.xml.
7 Uruchom aplikację, aby uruchomić emulator Androida i zweryfikować wynik zmian wprowadzonych w aplikacji.

Poniżej znajduje się zawartość zmodyfikowanego pliku głównego działania MainActivity.java. Ten plik może zawierać każdą z podstawowych metod cyklu życia. Dodaliśmy metodę broadcastIntent () , aby rozgłaszać niestandardową intencję.

package com.example.tutorialspoint7.myapplication;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

   /** Called when the activity is first created. */
   @Override
   
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
   }


   // broadcast a custom intent.
      
   public void broadcastIntent(View view){
      Intent intent = new Intent();
      intent.setAction("com.tutorialspoint.CUSTOM_INTENT"); sendBroadcast(intent);
   }
}

Poniżej znajduje się treść MyReceiver.java:

package com.example.tutorialspoint7.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

/**
 * Created by TutorialsPoint7 on 8/23/2016.
 */
public class MyReceiver extends BroadcastReceiver{
   @Override
   public void onReceive(Context context, Intent intent) {
      Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
   }
}

Poniżej znajduje się zmodyfikowana zawartość pliku AndroidManifest.xml . Tutaj dodaliśmy tag <receiver ... />, aby uwzględnić naszą usługę:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.tutorialspoint7.myapplication">

   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:supportsRtl="true"
      android:theme="@style/AppTheme">
		
      <activity android:name=".MainActivity">
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   
      <receiver android:name="MyReceiver">
         <intent-filter>
            <action android:name="com.tutorialspoint.CUSTOM_INTENT">
            </action>
         </intent-filter>

      </receiver>
   </application>

</manifest>

Poniżej będzie treść res/layout/activity_main.xml plik, aby zawierał przycisk do rozpowszechniania naszych niestandardowych zamiarów -

<RelativeLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools" 
   android:layout_width="match_parent"
   android:layout_height="match_parent" 
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin" 
   tools:context=".MainActivity">
   
   <TextView
      android:id="@+id/textView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Example of Broadcast"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:textSize="30dp" />
      
   <TextView
      android:id="@+id/textView2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials point "
      android:textColor="#ff87ff09"
      android:textSize="30dp"
      android:layout_above="@+id/imageButton"
      android:layout_centerHorizontal="true"
      android:layout_marginBottom="40dp" />
      
   <ImageButton
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageButton"
      android:src="@drawable/abc"
      android:layout_centerVertical="true"
      android:layout_centerHorizontal="true" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/button2"
      android:text="Broadcast Intent"
      android:onClick="broadcastIntent"
      android:layout_below="@+id/imageButton"
      android:layout_centerHorizontal="true" />

</RelativeLayout>

Spróbujmy uruchomić zmodyfikowany plik Hello World!aplikacja, którą właśnie zmodyfikowaliśmy. Zakładam, że stworzyłeś swójAVDpodczas konfigurowania środowiska. Aby uruchomić aplikację ze studia Android, otwórz jeden z plików aktywności projektu i kliknij

ikonę Uruchom na pasku narzędzi. Android Studio instaluje aplikację na AVD i uruchamia ją, a jeśli wszystko jest w porządku z konfiguracją i aplikacją, wyświetli się następujące okno emulatora -

Teraz, aby nadać naszym niestandardowym zamiarom, kliknijmy Broadcast Intentprzycisk, spowoduje to wysłanie naszej niestandardowej intencji „com.tutorialspoint.CUSTOM_INTENT”, która zostanie przechwycona przez nasz zarejestrowany BroadcastReceiver, czyli MyReceiver i zgodnie z naszą zaimplementowaną logiką na dole symulatora pojawi się toast w następujący sposób -

Możesz spróbować zaimplementować inny BroadcastReceiver, aby przechwytywać generowane przez system intencje, takie jak uruchomienie systemu, zmiana daty, niski poziom baterii itp.