Sobes.tech
Junior

Jak podłączyć BroadcastReceiver do odbierania wiadomości w Android?

sobes.tech AI

Odpowiedź od AI

Istnieją dwie główne metody:

  1. Rejestracja dynamiczna:

    • Rejestruje się i wyrejestrowuje programowo w kodzie.
    • Trwa tak długo, jak aktywny jest obiekt, który go zarejestrował.
    • Używana do zdarzeń, które nie muszą być odbierane stale lub gdy aplikacja nie jest aktywna (np. przy zmianie orientacji, poziomu naładowania baterii).
    // W Activity lub Fragment
    private val receiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Przetwarzanie otrzymanej wiadomości
            intent?.action?.let { action ->
                when (action) {
                    Intent.ACTION_BATTERY_CHANGED -> {
                        // Przetwarzanie zmiany baterii
                    }
                    // Inne akcje
                }
            }
        }
    }
    
    override fun onResume() {
        super.onResume()
        val intentFilter = IntentFilter().apply {
            addAction(Intent.ACTION_BATTERY_CHANGED)
            // Inne akcje
        }
        registerReceiver(receiver, intentFilter)
    }
    
    override fun onPause() {
        super.onPause()
        unregisterReceiver(receiver)
    }
    
  2. Rejestracja statyczna:

    • Deklarowana w pliku manifest (AndroidManifest.xml).
    • Dłużej trwa niż cykl życia komponentu, który ją zarejestrował. Może odbierać wiadomości nawet wtedy, gdy aplikacja nie jest aktywna (dla niektórych działań, z ograniczeniami w najnowszych wersjach Androida).
    • Używana do zdarzeń systemowych, które muszą być odbierane stale (np. podczas uruchamiania urządzenia).
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.example.yourapp">
    
        <application ...>
            <receiver android:name=".MyBroadcastReceiver"
                      android:exported="true"> <!-- Ważne dla Android 12+ -->
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <action android:name="android.intent.action.AIRPLANE_MODE" />
                    <!-- Inne akcje -->
                </intent-filter>
            </receiver>
            ...
        </application>
    </manifest>
    
    // Klasa BroadcastReceiver
    class MyBroadcastReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Przetwarzanie otrzymanej wiadomości
            intent?.action?.let { action ->
                when (action) {
                    Intent.ACTION_BOOT_COMPLETED -> {
                        // Przetwarzanie po zakończeniu uruchamiania
                    }
                    Intent.ACTION_AIRPLANE_MODE_CHANGED -> {
                        // Przetwarzanie zmiany trybu samolotowego
                    }
                    // Inne akcje
                }
            }
        }
    }