Android中檢查、監(jiān)聽電量和充電狀態(tài)的方法
當你在更改后臺更新頻率來減少這些更新對電池壽命的影響時,檢查當前電量和充電狀態(tài)是一個好的開始。
電池壽命通過剩余電量和充電狀態(tài)來影響應用更新的執(zhí)行。當用交流電充電時,執(zhí)行更新操作對設備的影響是微不足道的,所以在大多數(shù)案例里,你可以把更新頻率調(diào)到最快。如果設備不在充電,降低更新頻率可以幫助延長電池壽命。
類似的,你可以檢查電池剩余電量級別,在電量低時,應該降低更新頻率甚至停止更新。
注:此處的更新,指的是類似發(fā)送心跳包的動作,或者定時更新內(nèi)容。并非僅僅指更新應用版本。如果是用戶動作,比如翻頁刷新,不需要根據(jù)電量和充電狀態(tài)處理。
判斷當前充電狀態(tài)
通過判斷當前充電狀態(tài)開始。BatteryManager會通過一個intent廣播所有電池和充電詳情,包含充電狀態(tài)。
因為這是一個sticky intent,你不需要注冊廣播接收器。簡單地通過調(diào)用 registerReceiver,像下面的代碼段傳入一個null的接收器,當前電池狀態(tài)的intent就會返回。你也可以傳入一個真實的接收器對象,但我們暫時不會操作更新,所以這是沒必要的。
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
//你可以讀到充電狀態(tài),如果在充電,可以讀到是usb還是交流電
// 是否在充電
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
// 怎么充
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
通常你應該在使用交流電充電時最大化后臺更新頻率,在使用usb充電時降低,不充電時更低。
監(jiān)聽充電狀態(tài)的改變
充電狀態(tài)很容易改變(插入/拔出充電器),所以監(jiān)聽充電狀態(tài),更改刷新頻率很重要。
充電狀態(tài)改變時,BatteryManager會發(fā)一個廣播。接收這些事件很重要,甚至在應用沒有運行的時候,因為可能你需要后臺開啟更新服務。所以,在Androidmanifest.xml里注冊廣播接收器,加上兩個action:ACTION_POWER_CONNECTED 和ACTION_POWER_DISCONNECTED作為過濾。
<receiver android:name=".PowerConnectionReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
</intent-filter>
</receiver>
在關聯(lián)的廣播接收器實現(xiàn)里,你可以讀出當前充電狀態(tài),方法跟上一步說的相同:
public class PowerConnectionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
}
}
判斷當前剩余電量
在某些案例里,判斷當前剩余電量同樣很有用。如果電量在某些水平之下,你可能會選擇降低后臺更新頻率。
你可以用下面的代碼讀到電量:
//當前剩余電量
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
//電量最大值
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
//電量百分比
float batteryPct = level / (float)scale;
注:暫時不知道為什么要這樣算,在我自己的機器上運行,scale就是100的。
監(jiān)聽剩余電量顯著改變
持續(xù)監(jiān)聽電池狀態(tài)不容易,但你不必這么做。
一般來說,持續(xù)監(jiān)聽電池電量對電池的影響比app的正常行為還要大。所以,只監(jiān)聽剩余電量的指定級別的改變(進入或離開低電量狀態(tài))是一個很好的實踐。
manifest里聲明的接收器,會在進入或離開低電量狀態(tài)時觸發(fā)。
<receiver android:name=".BatteryLevelReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_BATTERY_LOW"/>
<action android:name="android.intent.action.ACTION_BATTERY_OKAY"/>
</intent-filter>
</receiver>
剩余電量嚴重不足時,最好禁用所有后臺更新。在你可以使用手機之前就關機了,這種情況下,如果刷新數(shù)據(jù)并不重要。
在很多情況下,設備是是插入到底座里充電的(好吧,反正我沒見幾個人額外花錢買底座的,可能國外較多)。下節(jié)講怎么判斷當前底座狀態(tài)和監(jiān)聽插入底座時改變。文章鏈接:http://www.dbjr.com.cn/article/51557.htm
相關文章
Android編程實現(xiàn)系統(tǒng)重啟與關機的方法
這篇文章主要介紹了Android編程實現(xiàn)系統(tǒng)重啟與關機的方法,較為詳細的分析了Android運行原理與源碼剖析,講述了Android編程實現(xiàn)系統(tǒng)重啟與關機的相關技巧與注意事項,需要的朋友可以參考下2016-02-02Android仿淘寶詳情頁面viewPager滑動到最后一張圖片跳轉(zhuǎn)的功能
需要做一個仿淘寶客戶端ViewPager滑動到最后一頁,再拖動的時候跳到詳情的功能,剛開始我也迷糊了,通過查閱相關資料發(fā)現(xiàn)有好多種實現(xiàn)方法,下面小編給大家分享實例代碼,感興趣的朋友一起看看吧2017-03-03