簡體   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