Режим дремоты - службы переднего плана продолжают работать?

Я так запутался, читая это и пытаясь выяснить, будут ли запущены службы переднего плана, когда устройство переходит в режим глубокой дремоты. Может кто-нибудь уточнить. Я хочу знать о зефире и выше, могут ли службы переднего плана продолжать работать. Я всегда думал, что ВСЕ НИТИ приостановлены, даже если устройство находится в спящем режиме.

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

Из того, что я могу сказать в ограничениях режима ожидания, просто прекращаются сетевые вызовы. Но допустим, я выполнял какую-то длительную работу с основным потоком, это означает, что он может продолжать работать, верно? даже в дремлющем режиме?


person j2emanue    schedule 03.07.2019    source источник


Ответы (2)


Службы переднего плана не убиваются в спящем режиме, и это отличный способ обхода спящего режима. Отключение службы переднего плана во многом зависит от мобильной ОС. Как и Huawei, он убивает службы переднего плана по прошествии некоторого времени, и вы не сможете определить период. Некоторые другие телефоны убивают самую старую службу переднего плана, если обнаруживают неожиданный расход заряда батареи. В прошлом году я потратил около 6 месяцев, наблюдая за поведением телефонов при отключении служб переднего плана, когда включен режим ожидания или нет. и я пробовал более одного решения, чтобы переопределить режим ожидания при обнаружении местоположения каждые 10 секунд, и лучшим из них является служба переднего плана. Таким образом, вы столкнетесь с неожиданным поведением на некоторых телефонах, но это лучшее решение для режима ожидания и сна. Вы можете просмотреть эту статью и вы также можете посмотреть это руководство

person Ramzy Hassan    schedule 03.07.2019
comment
Мне нужно периодически выполнять сетевые вызовы на Wear OS, для этой цели я разработал простой runnable, который публикует себя в потоке с фиксированной скоростью, и я помещаю его в службу переднего плана как частный член, он запускается при вызове startService. Через 30 минут правильное поведение прекращается, вызовы не выполняются, но служба переднего плана остается активной. С этого момента каждый раз, когда я включаю экран, правильное поведение возобновляется и снова прекращается при выключении экрана. Любые идеи? - person Andrea Nisticò; 03.01.2020
comment
@ AndreaNisticò То же самое со мной, я поддерживаю сокет на переднем плане. Соединение с сокетом было отключено после того, как устройство заблокировалось примерно через 15 минут, а сокет повторно подключился, когда устройство выходит из спящего режима вручную или из-за уведомления какого-либо другого приложения (например, WhatsApp). - person Shivam Sharma; 13.02.2020
comment
@ShivamSharma Я нашел решение: в начале вашей службы переднего плана установите частичную блокировку пробуждения и никогда не снимайте ее, более того, я запускаю службу переднего плана в отдельном процессе. Таким образом, я могу выполнять сетевые вызовы, пока срок службы - person Andrea Nisticò; 13.02.2020
comment
@ AndreaNisticò благодарю тебя, брат, за твой ответ. Можете ли вы поделиться фрагментом кода именно тем, что вы пробовали. Я запускаю службу переднего плана над заданием jobScheduler (которое выполняется бесконечно, потому что я так и не закончил это задание). И я также установил частичную блокировку пробуждения внутри onStartCommnad () и никогда не снимаю ее. Я запустил планировщик заданий в отдельном потоке, а также поместил часть сокета службы переднего плана в отдельный поток. Тестирую на redmi (oreo), oneplus (pie). Я отслеживал поведение с терминальными командами и без них. - person Shivam Sharma; 14.02.2020
comment
@ AndreaNisticò У меня есть модуль SDK для вызовов VoIP, в котором я запускаю эту службу переднего плана через планировщик заданий. Я пытался упомянуть службу переднего плана как процесс в файле манифеста, но код внутри службы выполняется. Но как только сокет подключен, я возвращаю значение успеха внутри события обратного вызова модулю приложения (то есть процессу по умолчанию). Таким образом, в этом эксперименте отдельный процесс не взаимодействует с процессом по умолчанию. Также я не могу отлаживать код внутри службы переднего плана, хотя генерируется липкое уведомление. Не могли бы вы мне помочь ??? - person Shivam Sharma; 14.02.2020
comment
@ShivamSharma нужно ли вашей службе переднего плана взаимодействовать с основным приложением? Если вы получаете wakelock, но он по-прежнему не работает должным образом, попробуйте поместить службу переднего плана в отдельный процесс, имейте в виду, что вам придется реализовать AIDL для связи с этим процессом. Вы можете определить процесс внутри манифеста, под определением службы поместите ‹service android: name = .ForegroundKibiService android: process =: kibiProcess /› - person Andrea Nisticò; 14.02.2020
comment
На Pixel 4 XL служба переднего плана отключается в режиме дремоты - person IgorGanapolsky; 10.04.2020
comment
@IgorGanapolsky даже с отключенной функцией оптимизации заряда батареи? - person lasec0203; 23.09.2020
comment
@ lasec0203 Да. Единственный обходной путь, который я нашел, - это получить частичную блокировку пробуждения. - person IgorGanapolsky; 24.09.2020
comment
Привет, ребята, знаете ли вы какой-нибудь способ узнать, убивает ли Android службу переднего плана? У меня есть требование уведомить внутренний сервер, если это произойдет. - person ledragon; 08.04.2021

Режим дремоты предназначен для экономии заряда аккумулятора. Вы должны поместить свое приложение в белый список для отключения режима сна.

Источник: https://developer.android.com/training/monitoring-device-state/doze-standby

Поддержка других вариантов использования. Почти все приложения должны иметь возможность поддерживать Doze за счет правильного управления сетевым подключением, сигналами тревоги, заданиями и синхронизацией, а также с помощью высокоприоритетных сообщений FCM. Для узкого набора вариантов использования этого может быть недостаточно. Для таких случаев система предоставляет настраиваемый белый список приложений, которые частично освобождены от оптимизаций Doze и App Standby.

An app that is whitelisted can use the network and hold partial wake locks during Doze and App Standby. However, other restrictions

по-прежнему применяются к приложению из белого списка, как и к другим приложениям. Например, задания и синхронизация приложения из белого списка откладываются (на уровне API 23 и ниже), а его обычные аварийные сигналы AlarmManager не срабатывают. Приложение может проверить, находится ли оно в белом списке исключений, вызвав isIgnoringBatteryOptimizations ().

И вот как вставить ваше приложение в белый список: 1. Шаг -> Добавьте это разрешение в свой xml файл.

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

2. Шаг Игнорировать оптимизацию батареи

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    Intent intent = new Intent();
    String packageName = getPackageName();
    PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
    if (!pm.isIgnoringBatteryOptimizations(packageName)) {
        intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
        intent.setData(Uri.parse("package:" + packageName));
        startActivity(intent);
    }
}
person Berkay Işıkoğlu    schedule 03.07.2019
comment
это не тот вопрос. - person Shivam Sharma; 13.02.2020
comment
Предотвращает ли это прекращение работы Сервисов? - person IgorGanapolsky; 10.04.2020
comment
Непонятно. Я неправильно задаю этот вопрос. Извините. Я предполагаю, что: Он спрашивает меня, как предотвратить режим ожидания. Не как запретить сервису дремать. - person Berkay Işıkoğlu; 14.04.2020
comment
Не знаю об этом, похоже, что мое приложение все еще откладывает своих рабочих (это означает, что workermanager.equeue() не срабатывает, пока я не разблокирую устройство) в режиме ожидания, даже когда находится в белом списке оптимизации батареи. FWIW, тестирую на Pixel XL (android 10) - person lasec0203; 23.09.2020
comment
workermanager не является службой переднего плана, и WorkManager.Task соблюдает режим Doze - person Galeen; 17.06.2021