似乎有一些与主题相关的问题,但我没有找到明确的是/否的答案。
我有一个前台服务,它调用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秒,以便该应用程序能够获得更多的唤醒锁,从而完成其工作。
但是在Doze模式文档中,它将此声明为一种限制:
系统忽略唤醒锁。
这是否意味着在由setExactAndAllowWhileIdle在Doze模式下发出的警报所提供的10秒窗口中获得3分钟的部分唤醒锁将是有效的,还是会正常工作?
在我的例子中,广播接收器将通过异步任务向我的远程服务器发送数据,然后它将再次设置警报并重置我的步骤计数器。这会起作用吗?如果不行的话,我在打瞌睡模式下发送网络请求并执行后续代码的替代方案是什么?
编辑:通过调试我的应用程序测试显示,当迫使设备进入空闲模式时,我仍然可以访问网络,并且可以将数据发送到我的服务器。Doze模式文档说明了如何强制应用程序进入空闲状态,我确信这是午睡模式的同义词。然而,这应该是一个限制,所以我不知道这是如何运作的。
发布于 2022-03-21 04:37:14
是的,杜兹会忽略你的睡梦。然而,使用setExactAndAllowWhile Idle,您将在正确的时间完成工作,并且您将有那个10s窗口来进行任何您想要的处理。
发布于 2022-03-21 05:25:10
如果设备处于Doze模式,WakeLock不会对您有多大帮助。如果您使用了AlarmManager.ELAPSED_REALTIME_WAKEUP或AlarmManager.RTC_WAKEUP作为警报type,则AlarmManager.RTC_WAKEUP会唤醒您的设备。
然而,从安卓12你需要SCHEDULE_EXACT_ALARM的许可来设置准确的警报。如果你打算向PlayStore发布这个应用程序,就会有一些设置精确警报的可接受用例。确保您的应用程序符合这些政策。
https://stackoverflow.com/questions/71552249
复制相似问题