Sobes.tech
Junior
96
questionbank

Как подключить BroadcastReceiver для получения сообщений в Android?

Ответ от нейросети

sobes.tech 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. Статическая регистрация:

    • Объявляется в файле манифеста (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 -> {
                        // Обработка изменения режима полета
                    }
                    // Другие действия
                }
            }
        }
    }