Junior
Je možné odoslať vlastnú broadcast správu?
sobes.tech AI
Odpoveď od AI
Áno, je to možné.
Používa sa metóda sendBroadcast().
// Vytvoríme Intent pre náš broadcast
val intent = Intent("com.example.MY_CUSTOM_ACTION")
// Pridáme ďalšie údaje do Intentu (nepovinné)
intent.putExtra("data_key", "some_value")
// Pošleme broadcast
sendBroadcast(intent)
Na prijatie tejto správy je potrebné zaregistrovať BroadcastReceiver.
Registrácia môže byť statická (v Manifest) alebo dynamická (v kóde pomocou registerReceiver).
Príklad dynamickej registrácie:
// Vytvoríme Filter pre náš broadcast
val filter = IntentFilter("com.example.MY_CUSTOM_ACTION")
// Vytvoríme BroadcastReceiver
val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
// Spracovávame prijatú správu
val receivedData = intent?.getStringExtra("data_key")
Log.d("BroadcastReceiver", "Prijatý vlastný broadcast s dátami: $receivedData")
}
}
// Zaregistrujeme BroadcastReceiver
registerReceiver(receiver, filter)
// Nezabudnite zrušiť registráciu pri zničení komponentu
// unregisterReceiver(receiver)
Je potrebné vziať do úvahy nasledujúce body:
- Explicitné broadcast správy: Android 8.0 (API level 26) a vyšší zaviedol obmedzenia na neexplicitné broadcast správy za účelom optimalizácie spotreby zdrojov. Pre odoslanie takýchto správ v novších verziách Androidu je často potrebné uviesť balíček príjemcu (explicitný broadcast).
val intent = Intent("com.example.MY_CUSTOM_ACTION") // Uvedenie balíčka príjemcu (ak je známy) intent.setPackage("com.example.receiverapp") sendBroadcast(intent) - Oprávnenia: Pre odosielanie a prijímanie broadcast správ s určitým stupňom ochrany (napríklad
android.permission.SEND_SMS) môžu byť potrebné príslušné oprávnenia. - Lokálne broadcast správy: Pre prenos správ iba v rámci jednej aplikácie sa odporúča používať
LocalBroadcastManager(teraz je zastaraný, odporúča sa používať iné prístupy, napríklad Flow alebo RxJava), ktorý je efektívnejší a bezpečnejší.// Odoslanie lokálneho broadcast val localIntent = Intent("com.example.MY_LOCAL_ACTION") LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent) // Registrácia lokálneho BroadcastReceiver val localReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { // Spracovanie } } LocalBroadcastManager.getInstance(this).registerReceiver(localReceiver, IntentFilter("com.example.MY_LOCAL_ACTION")) // Zrušenie registrácie // LocalBroadcastManager.getInstance(this).unregisterReceiver(localReceiver)