[英]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_WAKEUP
或AlarmManager.RTC_WAKEUP
作为闹钟type
, setExactAndAllowWhileIdle
将唤醒您的设备。
但是,从 Android 12 您需要SCHEDULE_EXACT_ALARM
权限才能设置准确的警报。 如果您打算将应用程序发布到 PlayStore,则有一些可以接受的用例来设置准确的警报。 确保您的应用符合这些政策。
是的,打瞌睡会忽略你的唤醒锁。 但是,使用 setExactAndAllowWhile Idle,您将在正确的时间开始工作,并且您将拥有 10s window 来执行您希望的任何处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.