Sobes.tech
Junior

Lze odeslat vlastní broadcastovou zprávu?

sobes.tech AI

Odpověď od AI

Ano, je to možné.

Používá se metoda sendBroadcast().

// Vytvoříme Intent pro náš broadcast
val intent = Intent("com.example.MY_CUSTOM_ACTION")

// Přidáme další data do Intentu (nepovinné)
intent.putExtra("data_key", "some_value")

// Odešleme broadcast
sendBroadcast(intent)

Pro příjem této zprávy je nutné zaregistrovat BroadcastReceiver.

Registrace může být statická (v Manifestu) nebo dynamická (v kódu pomocí registerReceiver).

Příklad dynamické registrace:

// Vytvoříme filtr pro náš broadcast
val filter = IntentFilter("com.example.MY_CUSTOM_ACTION")

// Vytvoříme BroadcastReceiver
val receiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        // Zpracováváme obdrženou zprávu
        val receivedData = intent?.getStringExtra("data_key")
        Log.d("BroadcastReceiver", "Obdržel vlastní broadcast s daty: $receivedData")
    }
}

// Zaregistrujeme BroadcastReceiver
registerReceiver(receiver, filter)

// Nezapomeňte zrušit registraci při zničení komponenty
// unregisterReceiver(receiver)

Je třeba vzít v úvahu následující body:

  • Explicitní broadcast zprávy: Android 8.0 (API level 26) a vyšší zavedl omezení na neexplicitní broadcast zprávy za účelem optimalizace spotřeby zdrojů. Pro odeslání takových zpráv v novějších verzích Androidu je často nutné uvést balíček příjemce (explicitní broadcast).
    val intent = Intent("com.example.MY_CUSTOM_ACTION")
    // Uvedení balíčku příjemce (je-li známo)
    intent.setPackage("com.example.receiverapp")
    sendBroadcast(intent)
    
  • Oprávnění: Pro odesílání a přijímání broadcast zpráv s určitým stupněm ochrany (například android.permission.SEND_SMS) může být nutné příslušné oprávnění.
  • Lokální broadcast zprávy: Pro přenos zpráv pouze uvnitř jedné aplikace se doporučuje používat LocalBroadcastManager (nyní je zastaralý, doporučuje se používat jiné přístupy, například Flow nebo RxJava), který je efektivnější a bezpečnější.
    // Odeslání lokálního broadcast
    val localIntent = Intent("com.example.MY_LOCAL_ACTION")
    LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent)
    
    // Registrace lokálního BroadcastReceiver
    val localReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Zpracování
        }
    }
    LocalBroadcastManager.getInstance(this).registerReceiver(localReceiver, IntentFilter("com.example.MY_LOCAL_ACTION"))
    
    // Zrušení registrace
    // LocalBroadcastManager.getInstance(this).unregisterReceiver(localReceiver)