2

我正在寫一個數據記錄器應用程序,我需要每5分鐘完成一次http請求。用戶知道電池耗盡,這對我來說沒問題。我正在使用前臺服務和適當的通知,並且我有一個處理程序線程來讓我每5分鐘發佈一次可運行任務。看起來,當手機進入DOZE MODE模式時,線程被掛起,並且沒有可執行的程序被執行。這是正常的行爲還是我錯過了什麼? 任何幫助如何做到這一點將不勝感激。打盹模式暫停前臺服務

private void startTheForegroundService() { 
     NotificationCompat.Builder builder = new NotificationCompat.Builder(MainService.this); 
     builder.setPriority(Notification.PRIORITY_HIGH); 
     startForeground(1000, builder.build()); 

     httpThread = new HttpThread("Ping Thread", Thread.NORM_PRIORITY); 
     httpThread.start(); 
     httpThread.loop(); 
} 

線程代碼:

啓動線程服務代碼

public class HttpThread extends HandlerThread { 
    public Handler mHandler; 

    public HttpThread(String name, int priority) { 
     super(name, priority); 
    } 

    public synchronized void waitUntilReady() { 
     mHandler = new Handler(getLooper(), new Handler.Callback() { 
     @Override 
     public boolean handleMessage(Message msg) { 
      return false; 
     } 
     }); 
    } 

    public void loop() { 
     waitUntilReady(); 
     mHandler.post(new Runnable(){ 
     @Override 
     public void run() { 
     //code for the http request. 
     } 
    }); 
    } 
} 

回答

1

是正常行爲

是,FO r Android 6.0中的打盹模式,當應用程序靜止一個小時左右時觸發。 M Developer Preview擴展了打盹模式,即使在設備移動時它也會部分觸發,但我認爲您的場景在此情況下仍可繼續使用。

的用戶意識到電池消耗

的用戶可以添加到你的電池優化白名單(設置>應用>(齒輪圖示)>電池優化)。

+0

我已將應用列入白名單。當音樂流媒體應用程序(前臺服務)在設備處於打盹模式時繼續獲取數據?我的處理程序根本不觸發。 –

+0

@GiorgosOikonomou:「我將應用列入白名單」 - 嗯......「當音樂流媒體應用(前臺服務)在設備處於打盹模式時繼續獲取數據?」 - 我沒有在充電器上運行Android 6.0的一個小時以上的流媒體音樂應用程序。也許Android處理音頻焦點的應用程序的方式不同。 「我的處理程序完全沒有觸發」 - 你確定服務沒有被停止?你也可以考慮'ScheduledExecutorService'而不是基於'Handler'的方法,看看你是否有更好的運氣。 – CommonsWare

+0

ScheduledExecutorService作業一旦從多任務選項卡中清除應用程序就停止工作(多任務 - >殺應用程序) –