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