Sobes.tech
Junior

Ako pripojiť BroadcastReceiver na príjem správ v Android?

sobes.tech AI

Odpoveď od AI

Existujú dva hlavné spôsoby:

  1. Dynamická registrácia:

    • Registruje sa a odhlasuje programovo v kóde.
    • Žije, kým je aktívny objekt, ktorý ju zaregistroval.
    • Používa sa pre udalosti, ktoré nie je potrebné prijímať neustále, alebo keď aplikácia nie je aktívna (napríklad pri zmene orientácie, úrovne nabitia batérie).
    // V Activity alebo Fragmentu
    private val receiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Spracovanie prijatej správy
            intent?.action?.let { action ->
                when (action) {
                    Intent.ACTION_BATTERY_CHANGED -> {
                        // Spracovanie zmeny batérie
                    }
                    // Iné akcie
                }
            }
        }
    }
    
    override fun onResume() {
        super.onResume()
        val intentFilter = IntentFilter().apply {
            addAction(Intent.ACTION_BATTERY_CHANGED)
            // Iné akcie
        }
        registerReceiver(receiver, intentFilter)
    }
    
    override fun onPause() {
        super.onPause()
        unregisterReceiver(receiver)
    }
    
  2. Statická registrácia:

    • Je deklarovaná v manifest súbore (AndroidManifest.xml).
    • Žije dlhšie ako životný cyklus komponentu, ktorý ju zaregistroval. Môže prijímať správy aj keď aplikácia nie je aktívna (pre niektoré akcie, s obmedzeniami v posledných verziách Androidu).
    • Používa sa pre systémové udalosti, ktoré je potrebné prijímať neustále (napríklad pri spustení zariadenia).
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.example.yourapp">
    
        <application ...>
            <receiver android:name=".MyBroadcastReceiver"
                      android:exported="true"> <!-- Dôležité pre Android 12+ -->
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <action android:name="android.intent.action.AIRPLANE_MODE" />
                    <!-- Iné akcie -->
                </intent-filter>
            </receiver>
            ...
        </application>
    </manifest>
    
    // Trieda BroadcastReceiver
    class MyBroadcastReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Spracovanie prijatej správy
            intent?.action?.let { action ->
                when (action) {
                    Intent.ACTION_BOOT_COMPLETED -> {
                        // Spracovanie ukončenia načítania
                    }
                    Intent.ACTION_AIRPLANE_MODE_CHANGED -> {
                        // Spracovanie zmeny režimu lietadla
                    }
                    // Iné akcie
                }
            }
        }
    }