根據設備的狀態來改變應用的刷新頻率。在鏈接斷開時中止後臺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); } }