优化应用的电池寿命(笔记)-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);      
  }
}
相关文章
相关标签/搜索