Sobes.tech
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)