繁体   English   中英

setExactAndAllowWhileIdle 在打瞌睡模式下使用唤醒锁

[英]setExactAndAllowWhileIdle with Wakelock in Doze mode

似乎有一些与主题相关的问题,但我还没有找到明确的是/否答案。

我有一个调用setExactAndAllowWhileIdle来启动 BroadcastService 的前台服务。 下面是广播接收器中的代码。

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 文档中指出:

发出警报后,该应用程序还将被添加到系统的临时电源豁免列表中大约 10 秒,以允许该应用程序获取更多唤醒锁以完成其工作。

但在打瞌睡模式文档中,它指出这是一个限制:

系统忽略唤醒锁。

这是否意味着在 10 秒 window 中通过setExactAndAllowWhileIdle在 Doze 模式下发出的警报提供的 3 分钟部分唤醒锁定实际上是无用的,或者它会正常工作吗?

在我的例子中,广播接收器将通过该异步任务将数据发送到我的远程服务器,然后它会再次设置警报并重置我的步数计数器。 这行得通吗?如果行不通,在打瞌睡模式下发送网络请求并执行后续代码的替代方法是什么?

编辑:通过调试我的应用程序进行测试表明,当强制设备进入空闲模式时,我仍然具有网络访问权限并且可以将数据发送到我的服务器。 打瞌睡模式文档说明了如何强制应用程序进入空闲状态 state,我相当确定这是打瞌睡模式的同义词。 然而,这应该是一个限制,所以我不知道它是如何工作的。

如果设备处于 Doze 模式, WakeLock将无济于事。 如果您使用AlarmManager.ELAPSED_REALTIME_WAKEUPAlarmManager.RTC_WAKEUP作为闹钟typesetExactAndAllowWhileIdle将唤醒您的设备。

但是,从 Android 12 您需要SCHEDULE_EXACT_ALARM权限才能设置准确的警报。 如果您打算将应用程序发布到 PlayStore,则有一些可以接受的用例来设置准确的警报 确保您的应用符合这些政策。

是的,打瞌睡会忽略你的唤醒锁。 但是,使用 setExactAndAllowWhile Idle,您将在正确的时间开始工作,并且您将拥有 10s window 来执行您希望的任何处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM