GCM работает в фоновом режиме?

Я реализовал GCM в 5 своих приложениях, но у меня есть сомнения по поводу запуска GCM в фоновом режиме из-за поведения приложений, возможно, я немного путаюсь со стилями запуска приложений на переднем плане и в фоновом режиме. Я вижу свои приложения, перечисленные в разделе "Загруженные" приложения в настройках, когда они устанавливаются и регистрируют идентификатор устройства, и я нажимаю клавишу возврата в моем приложении.

Они не перечислены в разделе "Бег". Они попадают в раздел "Запуск", когда есть сообщение (уведомление) и когда уведомление генерируется и отображается в панели уведомлений, они удаляются из "Запуск". Однако, если я нажимаю на раздел "Загруженные", я вижу активированную кнопку "Стоп" (которую я вижу для большинства приложений), что означает, что что-то работает.

Мой вопрос заключается в том, что мое приложение работает и использует ресурсы мобильного телефона, когда нет активности, если я использую GCM в своем приложении? Есть ли служба, работающая в фоновом режиме, если да, то почему она не указана во всех других приложениях в разделе "Работает"?

2 ответа

Решение

Принудительная остановка приложения не означает, что оно было запущено до того, как вы принудительно остановили его. Это просто способ позволить пользователю сообщить Android, что он не хочет, чтобы приложение запускалось снова, пока пользователь не запустит его снова вручную.

Если вы принудительно остановите приложение, оно не сможет получать сообщения GCM, пока пользователь не запустит его вручную, поскольку фоновая служба GCM не сможет запустить его автоматически.

Такое поведение было представлено в Android 3.1 с элементами управления запуском:

Запустить элементы управления на остановленных приложениях

Начиная с Android 3.1, менеджер пакетов системы отслеживает приложения, которые находятся в остановленном состоянии, и предоставляет средства для контроля их запуска из фоновых процессов и других приложений.

Обратите внимание, что состояние остановки приложения отличается от состояния остановки действия. Система управляет этими двумя остановленными состояниями отдельно.

Платформа определяет два новых флага намерений, которые позволяют отправителю указать, следует ли разрешить намерению активировать компоненты в остановленном приложении.

FLAG_INCLUDE_STOPPED_PACKAGES - Включить целевые фильтры остановленных приложений в список потенциальных целей для решения.

FLAG_EXCLUDE_STOPPED_PACKAGES - исключить целевые фильтры остановленных приложений из списка> потенциальных целей.

Когда ни один, ни оба из этих флагов не определены в намерении, поведение по умолчанию состоит в том, чтобы включить фильтры остановленных приложений в список потенциальных целей.

Обратите внимание, что система добавляет FLAG_EXCLUDE_STOPPED_PACKAGES ко всем вещательным намерениям. Это делает это для предотвращения случайного или излишнего запуска широковещательных приложений из остановленных приложений. Фоновая служба или приложение могут переопределить это поведение, добавив флаг FLAG_INCLUDE_STOPPED_PACKAGES к намерениям широковещания, которым следует разрешить активацию остановленных приложений.

Приложения находятся в остановленном состоянии, когда они впервые установлены, но еще не запущены, и когда они вручную остановлены пользователем (в разделе "Управление приложениями").

В GCM процесс выполняется в фоновом режиме, но это процесс, который обслуживает все приложения на устройстве, поэтому установка дополнительных приложений, использующих GCM, не влияет на количество запущенных фоновых процессов.

Это все равно, что спросить, всегда ли работает приложение "Вызов" или "Сообщение", ожидая телефон или SMS. Ну, есть компоненты Android Framework, называемые BroadCastReceivers. ОС передает сообщение о намерениях всякий раз, когда принимается вызов, принимается сообщение, обнаруживается низкий уровень заряда батареи, срабатывает сигнал тревоги и даже при получении уведомления.

Затем у нас есть различные приложения, которые зарегистрированы для получения некоторых широковещательных сообщений, которые запускает ОС. Это делается в манифесте приложений (как правило). Поэтому, если ваше приложение зарегистрировано для получения широковещательного сообщения для сообщения GCM, оно будет получено вашим приложением.

Просто удалите широковещательный приемник для GCM в своем манифесте. Ваше приложение больше не будет отвечать на GCM. Далее, как приложение различает несколько приемников GCM на одном устройстве? Я имею в виду, как отличить, если уведомление GCM для приложения A или приложения B?

Это связано с APP_ID, с которым вы регистрируетесь в GCM. Это может быть сопоставлено с именем пакета вашего приложения. Мы предоставляем имя пакета при регистрации на GCM

Другие вопросы по тегам