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