[英]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.