1. 程式人生 > >Android實時獲取電量

Android實時獲取電量

Android開發者可以利用BroadcastReceiver機制,獲取電池電量變化的ACTION_BATTERY_CHANGED intent,進而獲取當前android裝置的電池狀態。
具體操作步驟:
1. 建立一個監聽ACTION_BATTERY_CHANGED事件的intentFilter。
2. 建立一個BroadcastReceiver物件,該物件可以接收broadcast intent。
3. 註冊BroadcastReceiver物件來監聽ACTION_BATTERY_CHANGED事件。
4. 在BroadcastReceiver物件中,重寫onReceive方法,在onReceive方法的傳入引數intent裡獲取需要的電池狀態資訊。
5. 在生命週期結束時,取消step4中的註冊。

[java]view plaincopyprint?
  1. publicclass BatteryMonitorActivity extends Activity {  
  2.     private TextView batterLevel;  
  3.     private BroadcastReceiver batteryLevelRcvr;  
  4.     private IntentFilter batteryLevelFilter;  
  5.     @Override
  6.     publicvoid onCreate(Bundle savedInstanceState) {  
  7.         super
    .onCreate(savedInstanceState);  
  8.         setContentView(R.layout.main);  
  9.         batterLevel = (TextView) findViewById(R.id.batteryLevel);  
  10.         monitorBatteryState();  
  11.     }  
  12.     @Override
  13.     protectedvoid onDestroy() {  
  14.         super.onDestroy();  
  15.         unregisterReceiver(batteryLevelRcvr);  
  16.     }  
  17.     privatevoid monitorBatteryState() {  
  18.         batteryLevelRcvr = new BroadcastReceiver() {  
  19.             publicvoid onReceive(Context context, Intent intent) {  
  20.                 StringBuilder sb = new StringBuilder();  
  21.                 int rawlevel = intent.getIntExtra("level", -1);  
  22.                 int scale = intent.getIntExtra("scale", -1);  
  23.                 int status = intent.getIntExtra("status", -1);  
  24.                 int health = intent.getIntExtra("health", -1);  
  25.                 int level = -1// percentage, or -1 for unknown
  26.                 if (rawlevel >= 0 && scale > 0) {  
  27.                     level = (rawlevel * 100) / scale;  
  28.                 }  
  29.                 sb.append("The phone");  
  30.                 if (BatteryManager.BATTERY_HEALTH_OVERHEAT == health) {  
  31.                     sb.append("'s battery feels very hot!");  
  32.                 } else {  
  33.                     switch (status) {  
  34.                     case BatteryManager.BATTERY_STATUS_UNKNOWN:  
  35.                         sb.append("no battery.");  
  36.                         break;  
  37.                     case BatteryManager.BATTERY_STATUS_CHARGING:  
  38.                         sb.append("'s battery");  
  39.                         if (level <= 33)  
  40.                             sb.append(" is charging, battery level is low"
  41.                                     + "[" + level + "]");  
  42.                         elseif (level <= 84)  
  43.                             sb.append(" is charging." + "[" + level + "]");  
  44.                         else
  45.                             sb.append(" will be fully charged.");  
  46.                         break;  
  47.                     case BatteryManager.BATTERY_STATUS_DISCHARGING:  
  48.                     case BatteryManager.BATTERY_STATUS_NOT_CHARGING:  
  49.                         if (level == 0)  
  50.                             sb.append(" needs charging right away.");  
  51.                         elseif (level > 0 && level <= 33)  
  52.                             sb.append(" is about ready to be recharged, battery level is low"
  53.                                     + "[" + level + "]");  
  54.                         else
  55.                             sb.append("'s battery level is" + "[" + level + "]");  
  56.                         break;  
  57.                     case BatteryManager.BATTERY_STATUS_FULL:  
  58.                         sb.append(" is fully charged.");  
  59.                         break;  
  60.                     default:  
  61.                         sb.append("'s battery is indescribable!");  
  62.                         break;  
  63.                     }  
  64.                 }  
  65.                 sb.append(' ');  
  66.                 batterLevel.setText(sb.toString());  
  67.             }  
  68.         };  
  69.         batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);  
  70.         registerReceiver(batteryLevelRcvr, batteryLevelFilter);  
  71.     }  
  72. }  


[html]view plaincopyprint?
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent"
  5.     android:orientation="vertical">
  6.     <TextView
  7.         android:id="@+id/batteryLevel"
  8.         android:layout_width="fill_parent"
  9.         android:layout_height="fill_parent"
  10.         android:gravity="center_vertical|center_horizontal"
  11.         android:textSize="50dip">
  12.     </TextView>
  13. </LinearLayout>


Android的上層實現顯示手機電池電量是通過監聽實現,當電池電量改變時會通知到程式。
當然這個有朋友就要問了我不是想監聽電池電量,我是想直接獲取當前的電池電量。
其實這是同一個問題,當你在初始化監聽器的時候他會自動首先獲取電池的電量資訊,然後後續當電池改變時同時也會通知當前電池電量的改變情況。

轉自

記得加許可權