Sobes.tech
Junior

Как да свържете BroadcastReceiver за получаване на съобщения в Android?

sobes.tech AI

Отговор от AI

Има два основни начина:

  1. Динамична регистрация:

    • Регистрира се и се отменя програмно в кода.
    • Живее, докато активният обект, който я е регистрирал.
    • Използва се за събития, които не е необходимо да се получават постоянно, или когато приложението не е активно (например при промяна на ориентацията, нивото на зареждане на батерията).
    // В Activity или Fragment
    private val receiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Обработка на полученото съобщение
            intent?.action?.let { action ->
                when (action) {
                    Intent.ACTION_BATTERY_CHANGED -> {
                        // Обработка на промяната на батерията
                    }
                    // Други действия
                }
            }
        }
    }
    
    override fun onResume() {
        super.onResume()
        val intentFilter = IntentFilter().apply {
            addAction(Intent.ACTION_BATTERY_CHANGED)
            // Други действия
        }
        registerReceiver(receiver, intentFilter)
    }
    
    override fun onPause() {
        super.onPause()
        unregisterReceiver(receiver)
    }
    
  2. Статична регистрация:

    • Обявява се в manifest файла (AndroidManifest.xml).
    • Живее по-дълго от жизнения цикъл на компонента, който я е регистрирал. Може да получава съобщения дори когато приложението не е активно (за някои действия, с ограничения в последните версии на Android).
    • Използва се за системни събития, които трябва да се получават постоянно (например при зареждане на устройството).
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.example.yourapp">
    
        <application ...>
            <receiver android:name=".MyBroadcastReceiver"
                      android:exported="true"> <!-- Важно за Android 12+ -->
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <action android:name="android.intent.action.AIRPLANE_MODE" />
                    <!-- Други действия -->
                </intent-filter>
            </receiver>
            ...
        </application>
    </manifest>
    
    // Клас BroadcastReceiver
    class MyBroadcastReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Обработка полученото съобщение
            intent?.action?.let { action ->
                when (action) {
                    Intent.ACTION_BOOT_COMPLETED -> {
                        // Обработка на завършване на зареждането
                    }
                    Intent.ACTION_AIRPLANE_MODE_CHANGED -> {
                        // Обработка на промяната на режим на полет
                    }
                    // Други действия
                }
            }
        }
    }