優化應用的電池壽命(筆記)-2

Lesson-2 最大限度的下降按期更新的影響

根據設備的狀態來改變應用的刷新頻率。在鏈接斷開時中止後臺service,在電池不足時下降刷新頻率。java

Use Cloud to Device Messaging as an Alternative to Polling

C2DM 基於TCP/IP長鏈接的實現網絡

Optimize Polling with Inexact Repeating Alarms and Exponential Backoffs

   使用polling時,默認的數據刷新頻率儘量低;
   一種簡單的方式是讓用戶本身去設置更新的頻率;

   當有規律的更新時,使用不精確(inexact)的重複alarms,使系統「逐步轉向」到確切時刻。app

int alarmType = AlarmManager.ELAPSED_REALTIME;
long interval = AlarmManager.INTERVAL_HOUR;
long start = System.currentTimeMillis() + interval;

alarmManager.setInexactRepeating(alarmType, start, interval, pi);

   若是多個alarms被安排到差很少的時間觸發,這種「逐步轉向」將會使他們同時被觸發。fetch

   將alarm的type設置爲ELAPSED_REALTIMERTC ,而不是 _WAKEUP。這會經過等待狀態來進一步下降對電池的影響,直到手機再也不處於standby狀態。spa

  一種方式是使用指數回退模式來下降應用的更新頻率。若是一個應用在前一次更新後沒有再使用,給它設定一個最小更新頻率,到從新使用時再重置這個頻率是一種有效的作法,例如:code

SharedPreferences sp = 
  context.getSharedPreferences(PREFS, Context.MODE_WORLD_READABLE);

boolean appUsed = sp.getBoolean(PREFS_APPUSED, false);
long updateInterval = sp.getLong(PREFS_INTERVAL, DEFAULT_REFRESH_INTERVAL);

if (!appUsed)
  if ((updateInterval *= 2) > MAX_REFRESH_INTERVAL)  
    updateInterval = MAX_REFRESH_INTERVAL;

Editor spEdit = sp.edit();
spEdit.putBoolean(PREFS_APPUSED, false);
spEdit.putLong(PREFS_INTERVAL, updateInterval);
spEdit.apply();

rescheduleUpdates(updateInterval);
executeUpdateOrPrefetch();

  你能夠使用類似的指數回退模式來處理網絡重連。get

private void retryIn(long interval) {
  boolean success = attemptTransfer();
    
  if (!success) {
    retryIn(interval*2 < MAX_RETRY_INTERVAL ? 
            interval*2 : MAX_RETRY_INTERVAL);      
  }
}
相關文章
相關標籤/搜索