根据设备的状态来改变应用的刷新频率。在链接断开时中止后台service,在电池不足时下降刷新频率。java
C2DM 基于TCP/IP长链接的实现网络
当有规律的更新时,使用不精确(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_REALTIME或RTC
,而不是 _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); } }