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)