Лучший способ периодически проводить опрос приложения Android в фоновом режиме

#android

#Android

Вопрос:

Возьмем в качестве примера приложение Gmail. Независимо от того, включен телефон или нет, каждые 10 минут или около того он проводит опрос на предмет загрузки новых электронных писем, которые могли прийти с момента вашей последней проверки.

Я знаю, как создать новую службу и привязаться к ней. Но я вижу несколько способов добиться этого:

  • Свяжите один раз и запустите службу в бесконечном цикле, отключаясь в течение 10 минут между каждым циклом
  • Привязывайте и отменяйте привязку сразу после завершения, планируя следующую привязку каким-либо образом через 10 минут
  • Использование класса AlarmManager для планирования будущих опросов

Каковы компромиссы? Как приложение Gmail выполняет это?

Спасибо!

Комментарии:

1. Разве Gmail не использует Android Cloud для подключения к устройству? Я бы предположил, что да … но это дикое предположение без каких-либо конкретных знаний. android-developers.blogspot.com/2010/05 / …

2. @NeTeInStEiN похоже, что это так, я ошибся

Ответ №1:

Приложение Gmail использует нажатие, а не опрос. Я предлагаю использовать этот метод вместо этого, опрос является убийцей заряда батареи на мобильных устройствах.

Чтобы реализовать pushing, взгляните на C2DM.

Если вы все еще хотите проводить опрос, рекомендуемым способом было бы настроить периодический сигнал тревоги в AlarmManager.

ОБНОВЛЕНИЕ: Google устарел от C2DM и заменил его на Google Cloud Messaging (GCM)

ОБНОВЛЕНИЕ: Google устарел от GCM и заменил его на Firebase Cloud Messaging (FCM)

Комментарии:

1. Или рассмотрите Urban Airship или Xtify в качестве коммерческих сервисов, предлагающих аналогичные решения для C2DM.

2. @CommonsWare Следует отметить одну вещь: если каждый реализует свой собственный push-сервис, то весь смысл теряется. Я думаю, мы должны придерживаться C2DM, нравится нам это или нет.

3. «Следует отметить одну вещь: если каждый реализует свой собственный push-сервис, то весь смысл теряется». — мы приветствуем ваше мнение. C2DM — это бета-проект Google Labs, и поэтому ему может не хватать гарантий поддержки и уровня обслуживания, которые могут потребоваться некоторым компаниям.

4. Потрясающе, спасибо всем за комментарии! Люблю быстрые ответы. В моем приложении нет уникальных данных для каждого пользователя, каждый телефон проводит опрос, чтобы узнать, изменилась ли какая-либо универсальная информация. Поэтому не уверен, что push для каждого устройства является правильным решением здесь. AlarmManager выглядит великолепно. Спасибо!

Ответ №2:

  • Для непрерывного, но не интенсивного опроса, подобного тому, который вы комментируете (в интервале минут между опросами), я бы реализовал его с помощью AlarmManager. Таким образом, вы убедитесь, что телефон включается для опроса без необходимости блокировки, которая может привести к разрядке аккумулятора. Как указывало CommonsWare, вам все равно потребуется реализовать блокировку на время выполнения вашего кода, но вы можете отключить ее, как только код будет готов, избегая держать телефон включенным во время ожидания. Смотрите его комментарий для примера того, как это реализовать.

  • Я бы воспользовался сервисом, если вместо этого вам нужны более быстрые опросы в течение более короткого периода времени (секунды между каждым опросом), поскольку установка сигналов тревоги не имеет смысла для таких коротких периодов, и батарея все равно разрядится.

Комментарии:

1. Вам все равно понадобится, WakeLock если работа, которую вы будете выполнять, занимает значительное количество времени, поскольку вызываемый сигнал BroadcastReceiver не может многое сделать за onReceive() . Посмотрите WakefulIntentService на одну оболочку вокруг WakeLock работы: github.com/commonsguy/cwac-wakeful

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

3. О, я полностью согласен — постоянный сервис, позволяющий просто наблюдать за тиканьем часов, является антишаблоном. Я просто немного подшутил над частью «без необходимости в блокировке», вот и все.

4. @Aleadam: Я запланировал, что сигнал тревоги будет выполняться каждые 1 минуту. tas заключается в опросе сервера. Это работает, если у меня все в порядке, когда я не выполняю никаких интенсивных задач на телефоне. Но если я начинаю играть в любую игру, опрос прекращается (я думаю, сигналы тревоги прекращаются). Каково решение для этого?