Запуск службы переднего плана в спящем режиме

Я разрабатываю приложение, которое подключается к специальному устройству через Wi-Fi. Мне нужно делать обновления статуса за короткий промежуток времени, соответственно. постоянно обновлять статус моего специального устройства в приложении. FCM - это не вариант. Моя идея состоит в том, чтобы предоставить пользователю два варианта: быстрые обновления с использованием службы переднего плана или «медленные» обновления с использованием механизма периодических обновлений для экономии заряда батареи.

У меня вопрос о втором варианте. Интервал должен составлять около пяти минут. Поэтому использование JobScheduler невозможно. Но даже использование AlarmManager, похоже, не вариант, потому что я не могу получить доступ к сети во время окон обслуживания дремоты.

Я подумал об использовании WakefulBroadcastReceiver, чтобы получить Intent от AlarmManager, потребовать WakeLock и превратить мой долго работающий Service на передний план, вызвав startForeground(). Но похоже, что метод startForeground() не влияет на Service, пока устройство остается в спящем режиме.

Я прочитал много страниц о дремоте и услугах, но понятия не имею, как решить мою проблему ... У кого-нибудь есть идея?


person bartolja    schedule 15.03.2017    source источник
comment
Единственное, что действительно может разбудить устройство от дремоты, - это сообщение FCM, кроме этого, я не думаю, что у вас действительно есть какие-либо варианты делать то, что вы хотите, если вы не хотите сказать всем своим пользователям, чтобы они исключили ваше приложение из режима сна.   -  person tyczj    schedule 15.03.2017


Ответы (2)


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

person A. Shevchuk    schedule 15.03.2017
comment
Спасибо! Не видел этого раньше. Хорошее решение! - person bartolja; 16.03.2017
comment
Для других, заинтересованных в этом: Вот отличный учебник - person bartolja; 16.03.2017
comment
Могу ли я с помощью GcmTaskService сделать так, чтобы мое приложение всегда подключалось к Интернету, чтобы приложение не теряло уведомления? - person kavie; 31.05.2018
comment
@kavie нет, gcm будет выполняться только в определенные периоды времени. Чтобы получать уведомления, вы можете использовать push-уведомления. - person A. Shevchuk; 31.05.2018
comment
Я использую сторонний сервер для получения уведомлений в моем приложении для Android Wear. Есть ли способ сделать мое приложение, а не потерять уведомление, когда устройства Android входят в режим сна? (* Я не могу использовать FCM сейчас) - person kavie; 31.05.2018

Вы можете использовать setAlarmClock, но это не рекомендуется для ваших целей. Вместо этого вы можете использовать setExactAndAllowWhileIdle с ручным перепрограммированием с интервалом 15 минут. Лучший способ: GCM.

person iClaude    schedule 15.03.2017