BroadCastPrace na projektem w Androidzie ruszają pełną parą, a ja jak widać zapomniałem już o podstawach. Nic nie  stoi jednak na przeszkodzie aby te podstawy sobie przypomnieć. Dzisiaj opowiem krótko o “BroadcastReceiver”  . W Androidzie "Broadcast Receivers" służą do odbioru  wiadomości wysłanych  z innych aplikacji, bądź z samego systemu. Komunikaty te są czasami nazywane zdarzeniami.

Przykładowo aplikacja może również inicjować swoje transmisje, pozwalając w ten sposób innym aplikacjom  na ich odebranie, kiedy wystąpiła jakaś sytuacja “X”.

Twoja klasa dziedzicząca po BroadcastReceiver może przechwytywać te komunikaty, po czym wykonać odpowiednie akcje.

Istnieją dwa ważne kroki, które sprawią, że twój BroadcastReceiver będzie istniał

  • Stworzyć klasę dziedziczącą po BroadcastReceiver
  • Zarejestrować swoją klasę BroadcastReceiver

Stworzenie swojego BroadcastReceiver

Tak jak pisałem wcześniej twój własny BroadcastReceiver  musi dziedziczyć po tej samej klasie oraz przeciążać metodę onReceiver(). Ta metoda wykona się za każdym razem, gdy dany sygnał został wysłany. Do metody zostanie przekazany  obiekt “Intent” (intencja). Możemy w nim umieścić swoje dane, jeśli  istnieje taka potrzeba.

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

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

Dla uproszczenia kodu ja nie będę niczego przekazywał w obiekcie Intent.

Rejestrowanie BroadcastReceiver

Aplikacja nadsłuchuje specyficznych “Broadcast-ów” poprzez ich zarejestrowanie w pliku AndroidMaifest.xml.

Ma to sens, ponieważ nigdzie w swojej aplikacji nie tworzysz obiektu klasy “MyReceiver” , aby nasłuch już działał.

Możesz podpiąć swoją klasę “MyReceiver” do jakiejkolwiek akcji systemowej. Oto parę z nich:

Magiczny string zdarzeniaOpis
android.intent.action.BATTERY_CHANGEDZmiana stanu baterii lub innych informacji na temat baterii
android.intent.action.BATTERY_LOWPoziom baterii jest niski na danym urządzeniu
android.intent.action.BATTERY_OKAYPoziom baterii jest okej po przeżytym stanie niskim.
android.intent.action.BOOT_COMPLETEDUruchomione tylko raz, gdy system skończy się uruchamiać.
android.intent.action.CALLZadzwoń do kogoś używając specyficznych danych
android.intent.action.CALL_BUTTONUżytkownik w urządzeniu lub w UI nacisną przycisk “dzwonienia”.
android.intent.action.DATE_CHANGEDData uległa zmianie
android.intent.action.REBOOTUrządzenie się resetuje.

 

My jednak spróbujemy wywołać własną akcję o nazwie “cezary.activebreciver.CUSTOM_INTENT” . Ważne aby ta nazwa była unikatowa dla twojej aplikacji.

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="cezary.activitybreceiver.MainActivity"
            android:label="@string/app_name" >
            <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="cezary.activebreciver.CUSTOM_INTENT">
	          </action>
          </intent-filter>
      	</receiver>
</application>

Przejdźmy do aktywności

Oto kod XML określający wygląd aktywności. Aplikacja ta będzie zawierać tylko jeden przycisk.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical" >

   <Button
       android:id="@+id/btnStartService"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:text="Odpal mój sygnał żeby został on załapany" />

</LinearLayout>

A oto kod aktywności, jak i zdarzenia Click dla jedynego przycisku.

public class MainActivity extends Activity {

       @Override
       public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          
          Button btn = (Button)findViewById(R.id.btnStartService);
          btn.setOnClickListener(new OnClickListener() {
            
            public void onClick(View v) {
                    SendSignal();
            }
        });
       }
       
       public void SendSignal()
       {
              Intent intent = new Intent();
              intent.setAction("cezary.activebreciver.CUSTOM_INTENT");
              sendBroadcast(intent);
       }
}

Aby wysłać sygnał do naszej klasy “MyReceiver” musimy najpierw utworzyć obiekt Intent. W obiekcie Intent ustawiamy akcję na tą samą, którą zarejestrowaliśmy w AndroidMaifest.xml.

Na końcu korzystamy z metody “sendBroadcast”.

Android Recvier Intent