Кажется, есть несколько вопросов, связанных с темой темы, но я не нашел четкого ответа да/нет на это.
У меня есть служба переднего плана, которая вызывает setExactAndAllowWhileIdle
для запуска BroadcastService. Ниже приведен код в Broadcast Receiver.
public class StepCountUpdaterAlarm extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "myExampleApp::UpdateSteps");
wakeLock.acquire(3);
StepCounterHandler handler = StepCounterHandler.getInstance();
new TaskRunner().executeAsync(
new SetStepsForDay(SaveSharedPreference.getMemberId(context),
handler.getCumulativeSteps()),result -> {
handler.setAlarm(context);
if (isTimeToReset())
handler.resetStepsCounter();
});
wakeLock.release();
}
В setExactAndAllowWhileIdle
документация указано:
When the alarm is dispatched, the app will also be added to the system's temporary power exemption list for approximately 10 seconds to allow that application to acquire further wake locks in which to complete its work.
но в режиме Doze документация это указывается как ограничение:
The system ignores wake locks.
Означает ли это, что получение частичной блокировки пробуждения на 3 минуты в 10-секундном окне, предоставляемом сигналом тревоги, отправленным setExactAndAllowWhileIdle
в режиме ожидания, будет фактически бесполезным или оно будет работать нормально?
В моем случае Broadcast Receiver отправит данные на мой удаленный сервер через эту асинхронную задачу, а после этого снова установит будильник и сбросит мой счетчик шагов. Будет ли это работать, а если нет, каковы мои альтернативы для отправки сетевого запроса в спящем режиме и выполнения последующего кода?
Обновлено: Тестирование путем отладки моего приложения показывает, что при принудительном переводе устройства в режим ожидания у меня все еще есть доступ к сети и я могу отправлять данные на свой сервер. В документации режима Doze указано, как принудительно перевести приложение в состояние ожидания, которое, я уверен, является синонимом режима Doze. Тем не менее, это должно быть ограничением, поэтому я не знаю, как это может работать.
Да, Doze проигнорирует ваш wakelock. Однако с setExactAndAllowWhile Idle вы будете работать в нужное время, и у вас будет 10-секундное окно для выполнения любой обработки, которую вы пожелаете.
WakeLock
не сильно вам поможет, если устройство находится в режиме ожидания. setExactAndAllowWhileIdle
разбудит ваше устройство, если вы использовали AlarmManager.ELAPSED_REALTIME_WAKEUP
или AlarmManager.RTC_WAKEUP
в качестве будильника type
.
Однако с Android 12 вам нужно разрешение SCHEDULE_EXACT_ALARM
для установки точных будильников. И если вы планируете выпустить приложение в PlayStore, есть некоторые приемлемые варианты использования для установки точного будильника. Убедитесь, что ваше приложение соответствует этим политикам.