← Назад к вопросам

Какие знаешь сообщения от менеджера системы?

2.0 Middle🔥 101 комментариев
#Android компоненты

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Сообщения от SystemManager в Android

В контексте Android-разработки, когда говорят о "сообщениях от менеджера системы", обычно подразумевают широковещательные сообщения (broadcast intents), которые система рассылает для уведомления приложений о важных системных событиях. Эти сообщения отправляются через класс ActivityManager (и другие системные сервисы), но разработчики работают с ними как с broadcast'ами, которые можно получать с помощью BroadcastReceiver. Это ключевой механизм реактивного программирования в Android, позволяющий приложениям реагировать на изменения состояния устройства.

Основные категории системных сообщений

Системные intent'ы можно разделить на несколько ключевых категорий:

  1. Состояние устройства и питания:
    *   `ACTION_BOOT_COMPLETED` – завершение загрузки системы (требует разрешения `RECEIVE_BOOT_COMPLETED`).
    *   `ACTION_POWER_CONNECTED` / `ACTION_POWER_DISCONNECTED` – подключение/отключение зарядного устройства.
    *   `ACTION_BATTERY_LOW` / `ACTION_BATTERY_OKAY` – критически низкий и восстановленный уровень заряда.
    *   `ACTION_SCREEN_ON` / `ACTION_SCREEN_OFF` – включение/выключение экрана.

  1. Конфигурация и локализация:
    *   `ACTION_CONFIGURATION_CHANGED` – изменение конфигурации (ориентация, языковые настройки, размер шрифта). Чаще обрабатывается через `onConfigurationChanged()` в `Activity`.
    *   `ACTION_LOCALE_CHANGED` – изменение языковой локали устройства.

  1. Подключение и коммуникации:
    *   `ACTION_AIRPLANE_MODE_CHANGED` – изменение режима "В самолете".
    *   `ConnectivityManager.CONNECTIVITY_ACTION` (`android.net.conn.CONNECTIVITY_CHANGE`) – изменение состояния сетевого подключения. Начиная с Android 7.0 (API 24), для его получения требуется использовать `JobScheduler` или явный запрос через `ConnectivityManager`.
    *   `TelephonyManager.ACTION_PHONE_STATE_CHANGED` – изменение состояния телефонии (звонок).

  1. Хранение данных:
    *   `ACTION_MEDIA_MOUNTED` / `ACTION_MEDIA_UNMOUNTED` – монтирование/демонтирование внешнего накопителя.
    *   `ACTION_MEDIA_SCANNER_FINISHED` – завершение сканирования медиафайлов системным сканером.

  1. Работа приложений и времени:
    *   `ACTION_PACKAGE_ADDED` / `ACTION_PACKAGE_REMOVED` – установка/удаление пакета приложения. Требует разрешения `BROADCAST_PACKAGE_REMOVED`.
    *   `ACTION_TIMEZONE_CHANGED` / `ACTION_TIME_CHANGED` – изменение часового пояса или времени системы.
    *   `ACTION_DATE_CHANGED` – изменение даты.

  1. Пользовательские действия:
    *   `ACTION_USER_PRESENT` – пользователь разблокировал устройство после ввода PIN, графического ключа и т.д.
    *   `ACTION_CLOSE_SYSTEM_DIALOGS` – системный диалог (например, меню долгого нажатия на Home) был закрыт. Обычно используется для скрытия собственных системных окон.

Пример регистрации и обработки

Получать эти сообщения можно двумя способами: статически (через AndroidManifest.xml) и динамически (через код в Context). Динамическая регистрация требует отмены регистрации (обычно в onDestroy()).

// 1. Объявление BroadcastReceiver
class SystemBroadcastReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        when (intent.action) {
            Intent.ACTION_POWER_CONNECTED -> {
                Log.d("SystemEvents", "Зарядка подключена")
                // Запустить фоновую задачу или обновить UI
            }
            Intent.ACTION_BATTERY_LOW -> {
                Log.w("SystemEvents", "Батарея разряжена!")
                // Отложить энергоемкие операции
            }
            ConnectivityManager.CONNECTIVITY_ACTION -> {
                // Проверить текущий тип сети
                val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
                val activeNetwork = connectivityManager.activeNetworkInfo
                val isConnected = activeNetwork?.isConnectedOrConnecting == true
                // Обновить состояние сети в приложении
            }
        }
    }
}

// 2. Динамическая регистрация в Activity/Fragment/Service
class MainActivity : AppCompatActivity() {
    private lateinit var receiver: SystemBroadcastReceiver

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        receiver = SystemBroadcastReceiver()
        val filter = IntentFilter().apply {
            addAction(Intent.ACTION_POWER_CONNECTED)
            addAction(Intent.ACTION_BATTERY_LOW)
            // Для CONNECTIVITY_ACTION на новых версиях Android
            // используется другой подход (NetworkCallback)
        }
        registerReceiver(receiver, filter)
    }

    override fun onDestroy() {
        super.onDestroy()
        unregisterReceiver(receiver) // ОБЯЗАТЕЛЬНО отменить регистрацию!
    }
}

Важные изменения в современных версиях Android

Начиная с Android 8.0 (API 26), были введены существенные ограничения на работу с неявными broadcast'ами (к которым относится большинство системных событий). Статическая регистрация в манифесте для таких событий перестала работать, за исключением небольшого "белого списка" (например, ACTION_BOOT_COMPLETED). Поэтому для получения большинства системных сообщений в фоновом режиме приложения должны использовать:

  • Динамическую регистрацию в активном компоненте (например, ForegroundService или видимой Activity).
  • Альтернативные API, такие как JobScheduler, WorkManager или ConnectivityManager.NetworkCallback для событий сети.
  • Явные broadcast'ы (targeted broadcasts), которые адресованы конкретному приложению, не ограничены.

Понимание этих системных сообщений критически важно для создания надежных, энергоэффективных приложений, которые корректно реагируют на изменения окружения. Например, видеостриминговое приложение должно приостанавливать загрузку при потере сети (CONNECTIVITY_ACTION/NetworkCallback) и возобновлять при возвращении соединения, а сервис напоминаний должен перепланировать уведомления при перезагрузке устройства (ACTION_BOOT_COMPLETED).

Какие знаешь сообщения от менеджера системы? | PrepBro