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 zdarzenia | Opis |
android.intent.action.BATTERY_CHANGED | Zmiana stanu baterii lub innych informacji na temat baterii |
android.intent.action.BATTERY_LOW | Poziom baterii jest niski na danym urządzeniu |
android.intent.action.BATTERY_OKAY | Poziom baterii jest okej po przeżytym stanie niskim. |
android.intent.action.BOOT_COMPLETED | Uruchomione tylko raz, gdy system skończy się uruchamiać. |
android.intent.action.CALL | Zadzwoń do kogoś używając specyficznych danych |
android.intent.action.CALL_BUTTON | Użytkownik w urządzeniu lub w UI nacisną przycisk “dzwonienia”. |
android.intent.action.DATE_CHANGED | Data uległa zmianie |
android.intent.action.REBOOT | Urzą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”.