Junior
Czy można wysłać własne broadcastowe powiadomienie?
sobes.tech AI
Odpowiedź od AI
Tak, jest to możliwe.
Używa się metody sendBroadcast().
// Tworzymy Intent dla naszego broadcastu
val intent = Intent("com.example.MY_CUSTOM_ACTION")
// Opcjonalnie dodajemy dodatkowe dane do Intent
intent.putExtra("data_key", "some_value")
// Wysyłamy broadcast
sendBroadcast(intent)
Aby odebrać tę wiadomość, konieczne jest zarejestrowanie BroadcastReceiver.
Rejestracja może być statyczna (w Manifeście) lub dynamiczna (w kodzie za pomocą registerReceiver).
Przykład dynamicznej rejestracji:
// Tworzymy filtr dla naszego broadcastu
val filter = IntentFilter("com.example.MY_CUSTOM_ACTION")
// Tworzymy BroadcastReceiver
val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
// Przetwarzamy odebraną wiadomość
val receivedData = intent?.getStringExtra("data_key")
Log.d("BroadcastReceiver", "Odebrano niestandardowy broadcast z danymi: $receivedData")
}
}
// Rejestrujemy BroadcastReceiver
registerReceiver(receiver, filter)
// Nie zapomnij odwołać rejestracji przy niszczeniu komponentu
// unregisterReceiver(receiver)
Ważne jest, aby wziąć pod uwagę następujące kwestie:
- Wyraźne broadcasty: Android 8.0 (API poziom 26) i nowsze wprowadziły ograniczenia dla niejawnych broadcastów w celu optymalizacji zużycia zasobów. W nowszych wersjach Androida często konieczne jest wskazanie pakietu odbiorcy (broadcast wyraźny).
val intent = Intent("com.example.MY_CUSTOM_ACTION") // Wskazujemy pakiet odbiorcy (jeśli znany) intent.setPackage("com.example.receiverapp") sendBroadcast(intent) - Uprawnienia: Wysyłanie i odbieranie broadcastów z określonym poziomem ochrony (np.
android.permission.SEND_SMS) może wymagać odpowiednich uprawnień. - Lokalne broadcasty: Do przesyłania wiadomości tylko w obrębie jednej aplikacji zaleca się użycie
LocalBroadcastManager(obecnie przestarzałe, zamiast tego można użyć innych podejść jak Flow lub RxJava), które jest bardziej wydajne i bezpieczne.// Wysyłanie lokalnego broadcastu val localIntent = Intent("com.example.MY_LOCAL_ACTION") LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent) // Rejestrowanie lokalnego BroadcastReceiver val localReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { // Przetwarzanie } } LocalBroadcastManager.getInstance(this).registerReceiver(localReceiver, IntentFilter("com.example.MY_LOCAL_ACTION")) // Anulowanie rejestracji // LocalBroadcastManager.getInstance(this).unregisterReceiver(localReceiver)