Comments 34
Google старается минимизировать количество работающих фоновых сервисов и предлагает использовать JobScheduler и GcmNetworkManager.
То есть совсем режется возможность запускать вечноживущие сервисы?
В последних версиях андроида такие приложения засыпают, виджеты не обновляются, а при входе в приложение начинают все обновляться, что может быть не быстро. А актуальную информацию хочется видеть быстро, для чего приложение и работает в фоне.
Или например — есть у меня приложение для календаря, расширяющее его фукнциональность, для чего приложению нужен переодический рескан calendar provider-а. Сейчас все прекрасно работает, приложение раз в 30 минут просыпается на 10 секунд, проверить изменения в календаре, и засыпает дальше. Судя по системной статистике — батарейки на это уходит доля процента в день. Я так полагаю — мне теперь прийдется каждый раз показывать уведомление о том, что «я тут что-то делаю в фоне» при каждом таком просыпании. Пользователи то переживут, но недовольных много будет, да и выглядит это как-то криво.
(10 секунд — это на очень загруженном календаре с многими сотнями событий в месяц, как у меня, если событий меньше — то тратится еще меньше времени).
Так для переодических тасков есть JobScheduler + Alarm для старых версий. Зачем держать сервис в фоне все время? Тем более что он и так уже с 6-й версии в сон уходит без WakeLock'а, а с ним батарею жрет.
Сервис и так не висит постоянно. Он просыпается по таймеру, но вот на те 10 секунд работы приходится запускать сервис фоновый, т.к. иначе прилетит сразу ANR. А теперь получается (если я все правильно понимаю) нельзя запустить фоновый сервис по таймеру, только foreground сервис.
Аналогичное предложенному тут решение было в ранних версиях Windows Phone, но в более поздних таки добавили полноценный неприбиваемый сокет, хоть и неконтролируемый извне и весьма дико выглядящий.
По поводу экономии ресурсов путем прибивания фоновых задач — очень понравился подход Huawei, который предлагает пользователю в настройках питания опции убивания приложения, когда оно не на экране. При этом эта опция включена по умолчанию везде, кроме некоторого списка популярных приложений. В отличие от сторонних менеджеров активности, которые мониторят запуск программ и прибивают их сразу же, что нерационально, встроенная в ядро Android система даже не дает ничему не разрешенному запускаться.
Как по мне, можно более элегантно решить проблему надоедливого уведомления для foreground service при помощи группировки оных в какую-нибудь секцию в шторке уведомлений (рядом с WiFi, BT и т.п.). Там это не так бросается в глаза, но в то же время может быть более доступным и кастомизируемым (положение, видимость).
Конечно, это yet another icon в шторке, и тем не менее, так аккуратнее и остается понимание того, какие приложения сейчас работают, imho.
Так они же ввели Notification Channels — если разработчик приложения сделает иконку foreground сервиса и другие нотификации в разных channel-ах, то пользователь легко может скрыть только channel с foreground сервисом.
Время, когда Android позволял делать все что угодно, уходят в прошлое.
Лично для меня как пользователя была бы удобной возможность самостоятельно выбирать, что запрещать, а что нет. Например, мне было не очень удобно, когда они решили запретить сторонним приложениям управлять режимом полета.
Большинству пользователей или до лампочки(им некогда смотреть) эти настройки или они тупые(ну бывает), включают все настройки подряд и потом жалуются на слабую батарею. Я поддерживаю Google в этих ограничениях. Идут по стезе яблочной компании, потому что поняли, что на разработчиков положится нельзя в плане экономии ресурсов устройства.
такое поведение породит только больше проблем как для нас(разработчиков) так и для пользователей, будут миллионы проблем из-за "неверно предоставленного разрешения", недопонимания как это должно работать и тд. Разрешение либо есть, либо его нет.
подавляющее большинство при отказе в разрешении просто перестает работать.
вы пользуетесь какими-то неправильными приложениями. У меня таким, насколько помню, страдало всего одно.
Или Octopus
Или Oatmeal cookie — так называется желтое лого android 8. Название было на IO 2017
Android O: особенности поддержки новой операционной системы