【Android 电量优化】电量优化 ( 充电状态获取 | 主动获取充电状态 | 广播接受者监听充电状态 | 被动获取充电状态 | 注册空广播接受者获取历史广播 )
文章目錄
- 一、獲取充電狀態(tài)
- 二、被動獲取充電狀態(tài)
- 三、主動獲取充電狀態(tài)
參考 Google 官方文檔 : 優(yōu)化電池續(xù)航時間
一、獲取充電狀態(tài)
在應(yīng)用中執(zhí)行某些操作 , 如軟件云端備份 , 從服務(wù)器端獲取最新版本號 , 從服務(wù)器端緩存最新軟件安裝包 , 固件版本 , 等操作 , 最好都在充電狀態(tài) , 那么如何獲取充電狀態(tài)呢 , 這里給出兩個方式 , 分別是主動獲取充電狀態(tài) , 被動獲取充電狀態(tài) ;
二、被動獲取充電狀態(tài)
1 . 被動獲取充電狀態(tài) :
① 監(jiān)聽方法 : 注冊廣播接受者 , 監(jiān)聽充電狀態(tài)變化 ;
② 場景描述 : 當(dāng)用戶插拔數(shù)據(jù)線時 , 充電狀態(tài)發(fā)生變化時 , 系統(tǒng)發(fā)出對應(yīng)的廣播 , 使用廣播接受者接收這些廣播 ;
③ 數(shù)據(jù)線插入廣播 : 當(dāng)數(shù)據(jù)線插入時 , 系統(tǒng)會發(fā)出 Intent.ACTION_POWER_CONNECTED 廣播 ;
④ 數(shù)據(jù)線拔出廣播 : 當(dāng)數(shù)據(jù)線拔出時 , 系統(tǒng)會發(fā)出 Intent.ACTION_POWER_DISCONNECTED 廣播 ;
2 . 廣播接受者代碼示例 :
package kim.hsl.bp;import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.text.TextUtils; import android.util.Log;/*** 被動獲取充電狀態(tài)* 充電狀態(tài)發(fā)生變化時 , 系統(tǒng)發(fā)出的廣播 , 使用廣播接受者接收這些廣播*/ public class BatteryReceiver extends BroadcastReceiver {public static final String TAG = "BatteryReceiver";@Overridepublic void onReceive(Context context, Intent intent) {// 獲取廣播事件String action = intent.getAction();if(TextUtils.equals(Intent.ACTION_POWER_CONNECTED, action)){// 數(shù)據(jù)線插入Log.i(TAG, "數(shù)據(jù)線插入");}else if(TextUtils.equals(Intent.ACTION_POWER_DISCONNECTED, action)){// 數(shù)據(jù)先拔出Log.i(TAG, "數(shù)據(jù)線拔出");}} }3 . AndroidManifest.xml 注冊廣播接受者代碼示例 :
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="kim.hsl.bp"><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><receiver android:name=".BatteryReceiver" ><intent-filter><!-- 充電線插上 --><action android:name="android.intent.action.ACTION_POWER_CONNECTED" /><!-- 充電線拔出 --><action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /></intent-filter></receiver></application></manifest>三、主動獲取充電狀態(tài)
1 . 主動獲取充電狀態(tài)流程 :
① 創(chuàng)建 IntentFilter : 創(chuàng)建 IntentFilter , 并為其設(shè)置 Intent.ACTION_BATTERY_CHANGED 意圖 ;
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);② 注冊廣播接受者 : 調(diào)用 Context 對象的 registerReceiver 方法 , 設(shè)置 BroadcastReceiver receiver 廣播接收者參數(shù)為空 , IntentFilter 就是上述創(chuàng)建的意圖過濾器 ;
Intent intent = context.registerReceiver(null, intentFilter);③ 獲取充電狀態(tài) : 從注冊廣播返回的 Intent 意圖中獲取對應(yīng)的充電狀態(tài) ;
int batteryChargeState = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);④ 對比充電狀態(tài) : 將上述從 Intent.ACTION_BATTERY_CHANGED 匹配的意圖中獲取 BatteryManager.EXTRA_PLUGGED 對應(yīng)的值 , 與以下 333 個值進(jìn)行對比 , 如果一致 , 說明當(dāng)前是此種充電狀態(tài) ;
- BatteryManager.BATTERY_PLUGGED_AC : 交流電充電 ;
- BatteryManager.BATTERY_PLUGGED_USB : USB 接口充電 ;
- BatteryManager.BATTERY_PLUGGED_WIRELESS : 無線充電 ;
2 . 廣播接受者注冊用法 :
① 注冊廣播接收者 : registerReceiver 方法主要作用是在主線程注冊一個廣播接收者 BroadcastReceiver 運行 ;
② 廣播接收者調(diào)用 : 當(dāng)注冊的 IntentFilter 中的 action 匹配到相應(yīng)的廣播時 , BroadcastReceiver 會被在主線程調(diào)用 ;
③ 歷史廣播保存 : 系統(tǒng)發(fā)送完畢的廣播 , 會被保存下來 , 在后續(xù)注冊時發(fā)送 ;
④ 廣播復(fù)用機制 : 一旦有廣播接收者注冊廣播 , 如果之前發(fā)送完畢的廣播與本次注冊的 IntentFilter 意圖的 Action 匹配 , 次函數(shù)就會返回一個 Intent , 這個 Intent 就是之前已經(jīng)發(fā)送的廣播 ;
⑤ 如 : 本次注冊的 IntentFilter 中包含 Intent.ACTION_BATTERY_CHANGED , 如果使用如下方法 context.registerReceiver(null, intentFilter) 注冊空廣播接收者 , 返回值就是之前發(fā)送過的 Intent.ACTION_BATTERY_CHANGED 廣播 , 可以從該廣播中獲取對應(yīng)的充電狀態(tài)變化數(shù)據(jù) ;
⑥ 注冊多個意圖 : 如果在 IntentFilter 中注冊多個意圖 , 廣播接收者如果不為空 , 則會處理每一個意圖 , 但是返回值只能返回一個意圖 , 返回哪個由系統(tǒng)決定 ;
廣播接收者注冊方法有兩種功能 , 一個是注冊廣播接收者 , 另一個是獲取之前已經(jīng)發(fā)送的相同 Action 的歷史廣播 ;
這里使用的注冊廣播接收者的獲取歷史廣播的功能 ;
3 . 代碼示例 :
package kim.hsl.bp;import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.BatteryManager;public class BatteryUtils {/*** 主動獲取當(dāng)前電池是否在充電 , 即數(shù)據(jù)線是否插在手機上* @return*/public static boolean isBatteryCharging(Context context){boolean isBatteryCharging = false;// 主動發(fā)送包含是否正在充電狀態(tài)的廣播 , 該廣播會持續(xù)發(fā)送IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);// 注冊廣播接受者Intent intent = context.registerReceiver(null, intentFilter);// 獲取充電狀態(tài)int batteryChargeState = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);// 判定是否是 AC 交流電充電boolean isAc = batteryChargeState == BatteryManager.BATTERY_PLUGGED_AC;// 判斷是否是 USB 充電boolean isUsb = batteryChargeState == BatteryManager.BATTERY_PLUGGED_USB;// 判斷是否是 無線充電boolean isWireless = batteryChargeState == BatteryManager.BATTERY_PLUGGED_WIRELESS;// 如何上述任意一種為 true , 說明當(dāng)前正在充電isBatteryCharging = isAc || isUsb || isWireless;return isBatteryCharging;}}總結(jié)
以上是生活随笔為你收集整理的【Android 电量优化】电量优化 ( 充电状态获取 | 主动获取充电状态 | 广播接受者监听充电状态 | 被动获取充电状态 | 注册空广播接受者获取历史广播 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 电量优化】电量优化 (
- 下一篇: 【Android 电量优化】电量优化 (