SetExactAndAllowWhileIdle с Wakelock в режиме Doze

Кажется, есть несколько вопросов, связанных с темой темы, но я не нашел четкого ответа да/нет на это.

У меня есть служба переднего плана, которая вызывает 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. Тем не менее, это должно быть ограничением, поэтому я не знаю, как это может работать.

1
0
46
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Да, Doze проигнорирует ваш wakelock. Однако с setExactAndAllowWhile Idle вы будете работать в нужное время, и у вас будет 10-секундное окно для выполнения любой обработки, которую вы пожелаете.

WakeLock не сильно вам поможет, если устройство находится в режиме ожидания. setExactAndAllowWhileIdle разбудит ваше устройство, если вы использовали AlarmManager.ELAPSED_REALTIME_WAKEUP или AlarmManager.RTC_WAKEUP в качестве будильника type.

Однако с Android 12 вам нужно разрешение SCHEDULE_EXACT_ALARM для установки точных будильников. И если вы планируете выпустить приложение в PlayStore, есть некоторые приемлемые варианты использования для установки точного будильника. Убедитесь, что ваше приложение соответствует этим политикам.

Другие вопросы по теме