溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Android中檢查、監(jiān)聽(tīng)電量和充電狀態(tài)的方法

發(fā)布時(shí)間:2020-07-30 08:01:39 來(lái)源:網(wǎng)絡(luò) 閱讀:3874 作者:DennisRuan 欄目:移動(dòng)開(kāi)發(fā)

 

Android中檢查、監(jiān)聽(tīng)電量和充電狀態(tài)的方法

這篇文章主要介紹了Android中檢查、監(jiān)聽(tīng)電量和充電狀態(tài)的方法,如判斷當(dāng)前充電狀態(tài)、監(jiān)聽(tīng)充電狀態(tài)的改變、判斷當(dāng)前剩余電量等,需要的朋友可以參考下

當(dāng)你在更改后臺(tái)更新頻率來(lái)減少這些更新對(duì)電池壽命的影響時(shí),檢查當(dāng)前電量和充電狀態(tài)是一個(gè)好的開(kāi)始。

電池壽命通過(guò)剩余電量和充電狀態(tài)來(lái)影響應(yīng)用更新的執(zhí)行。當(dāng)用交流電充電時(shí),執(zhí)行更新操作對(duì)設(shè)備的影響是微不足道的,所以在大多數(shù)案例里,你可以把更新頻率調(diào)到最快。如果設(shè)備不在充電,降低更新頻率可以幫助延長(zhǎng)電池壽命。

類(lèi)似的,你可以檢查電池剩余電量級(jí)別,在電量低時(shí),應(yīng)該降低更新頻率甚至停止更新。

注:此處的更新,指的是類(lèi)似發(fā)送心跳包的動(dòng)作,或者定時(shí)更新內(nèi)容。并非僅僅指更新應(yīng)用版本。如果是用戶(hù)動(dòng)作,比如翻頁(yè)刷新,不需要根據(jù)電量和充電狀態(tài)處理。

判斷當(dāng)前充電狀態(tài)

通過(guò)判斷當(dāng)前充電狀態(tài)開(kāi)始。BatteryManager會(huì)通過(guò)一個(gè)intent廣播所有電池和充電詳情,包含充電狀態(tài)。

因?yàn)檫@是一個(gè)sticky intent,你不需要注冊(cè)廣播接收器。簡(jiǎn)單地通過(guò)調(diào)用 registerReceiver,像下面的代碼段傳入一個(gè)null的接收器,當(dāng)前電池狀態(tài)的intent就會(huì)返回。你也可以傳入一個(gè)真實(shí)的接收器對(duì)象,但我們暫時(shí)不會(huì)操作更新,所以這是沒(méi)必要的。

復(fù)制代碼代碼如下:


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;

通常你應(yīng)該在使用交流電充電時(shí)最大化后臺(tái)更新頻率,在使用usb充電時(shí)降低,不充電時(shí)更低。

監(jiān)聽(tīng)充電狀態(tài)的改變

充電狀態(tài)很容易改變(插入/拔出充電器),所以監(jiān)聽(tīng)充電狀態(tài),更改刷新頻率很重要。

充電狀態(tài)改變時(shí),BatteryManager會(huì)發(fā)一個(gè)廣播。接收這些事件很重要,甚至在應(yīng)用沒(méi)有運(yùn)行的時(shí)候,因?yàn)榭赡苣阈枰笈_(tái)開(kāi)啟更新服務(wù)。所以,在Androidmanifest.xml里注冊(cè)廣播接收器,加上兩個(gè)action:ACTION_POWER_CONNECTED ACTION_POWER_DISCONNECTED作為過(guò)濾。

復(fù)制代碼代碼如下:


<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>


在關(guān)聯(lián)的廣播接收器實(shí)現(xiàn)里,你可以讀出當(dāng)前充電狀態(tài),方法跟上一步說(shuō)的相同:

復(fù)制代碼代碼如下:


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;
}
}

判斷當(dāng)前剩余電量

在某些案例里,判斷當(dāng)前剩余電量同樣很有用。如果電量在某些水平之下,你可能會(huì)選擇降低后臺(tái)更新頻率。
你可以用下面的代碼讀到電量:

復(fù)制代碼代碼如下:


//
當(dāng)前剩余電量
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
//
電量最大值
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
//
電量百分比
float batteryPct = level / (float)scale;

注:暫時(shí)不知道為什么要這樣算,在我自己的機(jī)器上運(yùn)行,scale就是100的。

監(jiān)聽(tīng)剩余電量顯著改變

持續(xù)監(jiān)聽(tīng)電池狀態(tài)不容易,但你不必這么做。
一般來(lái)說(shuō),持續(xù)監(jiān)聽(tīng)電池電量對(duì)電池的影響比app的正常行為還要大。所以,只監(jiān)聽(tīng)剩余電量的指定級(jí)別的改變(進(jìn)入或離開(kāi)低電量狀態(tài))是一個(gè)很好的實(shí)踐。
manifest
里聲明的接收器,會(huì)在進(jìn)入或離開(kāi)低電量狀態(tài)時(shí)觸發(fā)。

復(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>

剩余電量嚴(yán)重不足時(shí),最好禁用所有后臺(tái)更新。在你可以使用手機(jī)之前就關(guān)機(jī)了,這種情況下,如果刷新數(shù)據(jù)并不重要。
在很多情況下,設(shè)備是是插入到底座里充電的(好吧,反正我沒(méi)見(jiàn)幾個(gè)人額外花錢(qián)買(mǎi)底座的,可能?chē)?guó)外較多)。下節(jié)講怎么判斷當(dāng)前底座狀態(tài)和監(jiān)聽(tīng)插入底座時(shí)改變。文章鏈接:http://www.jb51.net/article/51557.htm

 

Android判斷和監(jiān)聽(tīng)底座狀態(tài)和類(lèi)型的方法介紹

這篇文章主要介紹了Android判斷和監(jiān)聽(tīng)底座狀態(tài)和類(lèi)型的方法介紹,例如判斷當(dāng)前底座狀態(tài)、判斷插入底座類(lèi)型、監(jiān)控充電充電狀態(tài)等,需要的朋友可以參考下

底座的狀態(tài)跟充電狀態(tài)類(lèi)似,很多底座提供充電功能(座充).
底座狀態(tài)同樣使用sticky Intent廣播??梢圆樵?xún)?cè)O(shè)備是否插入底座,哪種底座。

判斷當(dāng)前底座狀態(tài)

廣播的ActionACTION_DOCK_EVENT,sticky Intent不需要注冊(cè)真實(shí)的接收器

復(fù)制代碼代碼如下:


IntentFilter ifilter = new IntentFilter(Intent.ACTION_DOCK_EVENT);
Intent dockStatus = context.registerReceiver(null, ifilter);
//You can extract the current docking status from the EXTRA_DOCK_STATE extra:

//int dockState = battery.getIntExtra(EXTRA_DOCK_STATE, -1);
boolean isDocked = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED;

判斷插入底座類(lèi)型

插入底座有四種類(lèi)型:

復(fù)制代碼代碼如下:

車(chē)載
桌面
Low-End (Analog) Desk(
猜是顯示模擬時(shí)鐘)
High-End (Digital) Desk(
猜是顯示數(shù)字時(shí)鐘)

后面兩項(xiàng)是在API11以后引入的,所以,后面三者都判斷是最好的。

復(fù)制代碼代碼如下:


boolean isCar = dockState == EXTRA_DOCK_STATE_CAR;
boolean isDesk = dockState == EXTRA_DOCK_STATE_DESK ||
dockState == EXTRA_DOCK_STATE_LE_DESK ||
dockState == EXTRA_DOCK_STATE_HE_DESK;

監(jiān)控充電

ACTION_DOCK_EVENT會(huì)在插入、撥出底座時(shí)廣播。所以接收這個(gè)廣告就可以了

復(fù)制代碼代碼如下:

<action android:name="android.intent.action.ACTION_DOCK_EVENT"/>

可以用上一步相同的方法讀取插入底座的類(lèi)型和狀態(tài).

 

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI