Sobes.tech
Junior

Ar galima siųsti savo broadcast žinutę?

sobes.tech AI

Atsakymas iš AI

Taip, tai įmanoma.

Naudojama sendBroadcast() metodas.

// Sukuriame Intent mūsų transliacijai
val intent = Intent("com.example.MY_CUSTOM_ACTION")

// Pridedame papildomų duomenų į Intent (neprivaloma)
intent.putExtra("data_key", "some_value")

// Siunčiame transliaciją
sendBroadcast(intent)

Norint gauti šią žinutę, reikia užregistruoti BroadcastReceiver.

Registracija gali būti statinė (Manifest'e) arba dinaminė (kodo pagalba registerReceiver).

Dinaminiam registravimui pavyzdys:

// Sukuriame filtrą mūsų transliacijai
val filter = IntentFilter("com.example.MY_CUSTOM_ACTION")

// Sukuriame BroadcastReceiver
val receiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        // Apdorojame gautą žinutę
        val receivedData = intent?.getStringExtra("data_key")
        Log.d("BroadcastReceiver", "Gauta asmeninė transliacija su duomenimis: $receivedData")
    }
}

// Užregistruojame BroadcastReceiver
registerReceiver(receiver, filter)

// Nepamirškite atšaukti registracijos, kai komponentas sunaikinamas
// unregisterReceiver(receiver)

Svarbūs punktai:

  • Aiškios transliacijos: Android 8.0 (API lygis 26) ir naujesnės versijos įvedė apribojimus neaiškioms transliacijoms, siekiant optimizuoti išteklių naudojimą. Norint siųsti tokias žinutes naujesnėse Android versijose, dažnai reikia nurodyti gavėjo paketą (aiški transliacija).
    val intent = Intent("com.example.MY_CUSTOM_ACTION")
    // Nurodyti gavėjo paketą (jei žinoma)
    intent.setPackage("com.example.receiverapp")
    sendBroadcast(intent)
    
  • Leidimai: Siųsti ir gauti transliacijas su tam tikru saugumo lygiu (pvz., android.permission.SEND_SMS) gali reikėti atitinkamų leidimų.
  • Vietinės transliacijos: Norint siųsti žinutes tik viduje vienos programos, rekomenduojama naudoti LocalBroadcastManager (dabar yra pasenęs, rekomenduojama naudoti kitas metodikas, pvz., Flow ar RxJava), kuris yra efektyvesnis ir saugesnis.
    // Siųsti vietinę transliaciją
    val localIntent = Intent("com.example.MY_LOCAL_ACTION")
    LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent)
    
    // Užregistruoti vietinį BroadcastReceiver
    val localReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Apdorojimas
        }
    }
    LocalBroadcastManager.getInstance(this).registerReceiver(localReceiver, IntentFilter("com.example.MY_LOCAL_ACTION"))
    
    // Atšaukti registraciją
    // LocalBroadcastManager.getInstance(this).unregisterReceiver(localReceiver)