Как работает технология push-уведомлений на Android?


218

Как Google реализовал функцию push-уведомлений? Работает ли он посредством опроса, выполняемого службой, работающей в фоновом режиме или другим способом?


24
Звучит как настоящий вопрос для меня. Мне было интересно, ответ на него, и Google привел меня сюда. Еще раз другой вопрос качества закрыт.
Тино Макларен

1
Я тоже хочу это знать и собирался написать вопрос, но он уже есть, так что это определенно хороший вопрос.
Игорь Чордаш

Ответы:


170

Из того, что я слышал во время конференции разработчиков Android в Израиле:

На облачном сервере Google просто есть TCP-сокет, ожидающий в режиме принятия . TCP-соединение было инициировано приложением Google Play. Вот почему Google Play должен быть установлен на устройстве, чтобы заставить работать Google Cloud Messaging (GCM) (ранее Android Cloud to Device Messaging Service - C2DM ).

Когда этот сокет TCP-клиента получает какое-либо сообщение, оно содержит такую ​​информацию, как имя пакета приложения, к которому оно должно быть адресовано, и, конечно, сами данные. Эти данные анализируются и упаковываются в намерение , которое передается и в конечном итоге принимается приложением.

Разъем TCP остается открытым, даже когда состояние радиосвязи устройства переходит в режим ожидания. Приложения не должны быть запущены, чтобы получить намерения.

Более подробная информация на http://developer.android.com/google/gcm/gcm.html


1
Но я думаю, что это работает и на эмуляторе. Мне приходит в голову то, что устройство постоянно обновляет свой сервер (IP). Когда серверу Google требуется отправить уведомление, он берет свой текущий путь и пересылает сообщение по этому пути. Прав ли я в какой-то степени?
Хавар Раза

2
@Khawar Raza: когда IP-адрес устройства по какой-то причине изменился, устройство отключается от сервера. когда это происходит - вместо этого устанавливается новое соединение, основанное на новом IP-адресе устройства.
Тал Канел

1
@Khawar Raza: эмулятор работает даже без Google Play. Я думаю, это инициирует этот сокет, встроенный внутри, а не в Google Play
Tal Kanel

2
Понимаю. Интересно, правда ли это?
you786

2
Так что это все еще опрос, но хорошая сторона в том, что опрос централизован в Google Play.
Accollativo

143

Android поддерживает одно активное соединение с серверами Google, но не использует много энергии или данных, потому что по нему не передается трафик, пока что-то не отправит сообщение Google Cloud Messaging (GCM) в приложение на вашем телефоне. На телефоне есть только одно соединение, используемое всеми приложениями: установка нового приложения, использующего GCM, не добавляет дополнительной нагрузки.

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

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

Взял это у: Source Также смотрите здесь .


1
Просто комментарий о соединении GCM. Это единственное соединение является соединением опроса.
Wmac

1
Для меня решающим моментом было то, что сторонний сервер, например сервер электронной почты, действительно отправляет уведомление на серверы Google GCM. Это услуга, предоставляемая Google бесплатно, и любой такой сторонний поставщик должен установить канал связи с серверами Google, используя свой протокол GCN. Кстати, протокол - это всего лишь HTTP-ответ в формате JSON. См. Developers.google.com/cloud-messaging для получения подробной информации.
Kyselejsyreček

10

Вы можете реализовать push-уведомление на Android самостоятельно с помощью длинного опроса TCP-соединения. Но это потребовало бы наличия дополнительной розетки => разряд батареи. Или вы можете открывать соединение через регулярные промежутки времени с помощью диспетчера тревог.

Google, вероятно, открывает один сокет для всех push-уведомлений C2DM, следовательно, это более эффективный аккумулятор.


поэтому он подтвердил, что клиент опрашивает TCP-соединение, верно? Вы знаете, как часто он опрашивает данные? например, каждые 5 секунд. или это быстро, как сердцебиение?
j2emanue

3

По состоянию на 10 апреля 2018 года Google устарел GCM. API сервера и клиента GCM устарели и будут удалены, как только 11 апреля 2019 года. Миграция приложений GCM в Firebase Cloud Messaging (FCM), которая наследует надежную и масштабируемую инфраструктуру GCM, а также множество новых функций.

https://firebase.google.com/docs/cloud-messaging/


1

Да, ты прав. У Google был сервис (GTalk Service), и этот сервис запрашивал серверы Google в течение некоторого времени.


Я не знаю. Я только что прочитал, как работает C2DM. Теперь что-то может измениться.
Юрий

-3

На устройствах Android, когда вы получаете push-уведомления, изображение и сообщение приложения отправителя появляются в строке состояния. Точно, когда клиент нажимает на уведомление, он / она попадает в приложение.


Это длительное TCP-соединение в фоновом режиме, это не объясняется в ответе, пожалуйста, придерживайтесь того, о чем спрашивает вопрос :)
Nishchal Gautam
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.