Sobes.tech
Junior

Hoe verbind je een BroadcastReceiver om berichten te ontvangen in Android?

sobes.tech AI

Antwoord van AI

Er zijn twee hoofdmethoden:

  1. Dynamische registratie:

    • Wordt programmatisch in de code geregistreerd en afgemeld.
    • Blijft actief zolang het object dat het registreerde, actief is.
    • Wordt gebruikt voor gebeurtenissen die niet constant hoeven te worden ontvangen of wanneer de app niet actief is (bijvoorbeeld bij het wijzigen van de oriëntatie, batterijstatus).
    // In Activity of Fragment
    private val receiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Verwerking van het ontvangen bericht
            intent?.action?.let { action ->
                when (action) {
                    Intent.ACTION_BATTERY_CHANGED -> {
                        // Verwerking van batterijwijziging
                    }
                    // Andere acties
                }
            }
        }
    }
    
    override fun onResume() {
        super.onResume()
        val intentFilter = IntentFilter().apply {
            addAction(Intent.ACTION_BATTERY_CHANGED)
            // Andere acties
        }
        registerReceiver(receiver, intentFilter)
    }
    
    override fun onPause() {
        super.onPause()
        unregisterReceiver(receiver)
    }
    
  2. Statische registratie:

    • Wordt gedeclareerd in het manifestbestand (AndroidManifest.xml).
    • Leeft langer dan de levenscyclus van de component die het registreerde. Kan berichten ontvangen, zelfs wanneer de app niet actief is (voor sommige acties, met beperkingen in de nieuwste Android-versies).
    • Wordt gebruikt voor systeemgebeurtenissen die constant moeten worden ontvangen (bijvoorbeeld bij het opstarten van het apparaat).
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.example.yourapp">
    
        <application ...>
            <receiver android:name=".MyBroadcastReceiver"
                      android:exported="true"> <!-- Belangrijk voor Android 12+ -->
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <action android:name="android.intent.action.AIRPLANE_MODE" />
                    <!-- Andere acties -->
                </intent-filter>
            </receiver>
            ...
        </application>
    </manifest>
    
    // BroadcastReceiver-klasse
    class MyBroadcastReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Verwerking van het ontvangen bericht
            intent?.action?.let { action ->
                when (action) {
                    Intent.ACTION_BOOT_COMPLETED -> {
                        // Verwerking na het voltooien van de opstart
                    }
                    Intent.ACTION_AIRPLANE_MODE_CHANGED -> {
                        // Verwerking van de wijziging in vliegtuigmodus
                    }
                    // Andere acties
                }
            }
        }
    }