Android之PowerManager&BatteryManager


  PowerManager是Android平台中用於管理控制設備電源狀態、重啟、休眠狀態、喚醒等,使用該API會影響到電池的待機時間,所以無非必要,一般不要使用。

  在PowerManager中有幾個比較重要的公共方法,具體如下:

  方法goToSleep、reboot、userActivity需要用到如下權限:

<uses-permission android:name="android.permission.REBOOT"/>
<uses-permission android:name="android.permission.DEVICE_POWER"/>

  而這兩個權限只有系統App才可使用。

  最重要的方法還是newWakeLock,通過該方法,我們可以獲取一個WakeLock對象,通過該對象我們可以控制設備電源的狀態。方法的第一個參數flags用於指示獲取哪種WakeLock,不同的Lock對cpu、屏幕、鍵盤燈有不同的影響,flag的值如下:

下面我們通過一個案例來說明WakeLock的用法,具體代碼如下:

public class PowerManagerActivity extends ActionBarActivity {

    private PowerManager powerManager;
    private PowerManager.WakeLock wakeLock;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_power_manager);
        powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
    }
    
    private void acquireWakeLock(){
        wakeLock = powerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK,"wakelock");
        if(wakeLock!=null)
            wakeLock.acquire();
    }

    private void releaseWakeLock(){
        if(wakeLock!=null)
            wakeLock.release();
    }

    @Override
    protected void onResume() {
        super.onResume();
        acquireWakeLock();
    }

    @Override
    protected void onPause() {
        super.onPause();
        releaseWakeLock();
    }
}
  使用該方法需要用到如下權限:

<uses-permission android:name="android.permission.WAKE_LOCK"/>

  代碼比較簡單,在獲取WakeLock的時候我們使用了PowerManager.SCREEN_BRIGHT_WAKE_LOCK,該flag表明cpu保持運行,屏幕保持常亮。同時注意WakeLock的acquire方法和release方法要成對使用,在這里利用了Activity的生命周期方法。
  還要注意的是WakeLock是Activity級別的不是針對整個Application的。
  要想獲取電池信息比如狀態、健康信息、電池容量等,我們可以通過注冊一個廣播接收者用來接收Intent.ACTION_BATTERY_CHANGED廣播即可,當電池發送變化的時候,系統就會發出該廣播。Android提供了BatteryManager類,該類主要提供了一些常量,用於從廣播的Intent中提取相關的數據,常量列表如下:

定義一個廣播接收者,用於檢測電池狀態的變化,關鍵代碼如下:
private class BattaryReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    if(intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)){
        //電池狀態
        int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS,0);
        String statusString = "";
        switch (status){
            case BatteryManager.BATTERY_STATUS_FULL:
                statusString="full";
                break;
            case BatteryManager.BATTERY_STATUS_CHARGING:
                statusString="charging";
                break;
            case BatteryManager.BATTERY_STATUS_DISCHARGING:
                statusString="discharging";
                break;
            case BatteryManager.BATTERY_STATUS_UNKNOWN:
                statusString="unknown";
                break;
            case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
                statusString="not charging";
                break;
        }
        //
        boolean present= intent.getBooleanExtra(BatteryManager.EXTRA_PRESENT,false);
        //integer field containing the current battery level,
        int curlevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);
        // integer containing the maximum battery level
        int maxLevel = intent.getIntExtra(BatteryManager.EXTRA_SCALE,0);
        //String describing the technology of the current battery
        String technology = intent.getStringExtra(BatteryManager.EXTRA_TECHNOLOGY);
        //integer containing the current health constant
        int health = intent.getIntExtra(BatteryManager.EXTRA_HEALTH,0);
        String healthStr = "";
        switch (health){
            case BatteryManager.BATTERY_HEALTH_COLD:
                healthStr="cold";
                break;
            case BatteryManager.BATTERY_HEALTH_DEAD:
                healthStr="dead";
                break;
            case BatteryManager.BATTERY_HEALTH_GOOD:
                healthStr="good";
                break;
            case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE:
                healthStr="voer voltage";
                break;
            case BatteryManager.BATTERY_HEALTH_UNKNOWN:
                healthStr="unknown";
                break;
            case BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE:
                healthStr="unspecified failure";
                break;
        }

        //integer containing the resource ID of a small status bar icon indicating the current battery state
        int smallIcon = intent.getIntExtra(BatteryManager.EXTRA_ICON_SMALL,0);
        //integer indicating whether the device is plugged in to a power source; 0 means it is on battery,
        // other constants are different types of power sources
        int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED,0);
        String pluggedStr="";
        switch (plugged){
            case BatteryManager.BATTERY_PLUGGED_AC:
                pluggedStr="AC";
                break;
            case BatteryManager.BATTERY_PLUGGED_USB:
                pluggedStr="USB";
                break;
            case BatteryManager.BATTERY_PLUGGED_WIRELESS:
                pluggedStr="wireless";
                break;
        }
        // integer containing the current battery temperature.
        int temperature= intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE,0);
        // integer containing the current battery voltage level.
        int voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE,0);
        StringBuilder sb = new StringBuilder("status:");
        sb.append(statusString);
        sb.append("\n");

        sb.append("present:").append(present);
        sb.append("\n");

        sb.append("level:").append(curlevel);
        sb.append("\n");
        sb.append("maxLevel:").append(maxLevel);
        sb.append("\n");
        sb.append("technology:").append(technology);
        sb.append("\n");
        sb.append("health:").append(healthStr);
        sb.append("\n");
        sb.append("icon:").append(smallIcon);
        sb.append("\n");
        sb.append("plugged:").append(pluggedStr);
        sb.append("\n");
        sb.append("temperature:").append(temperature);
        sb.append("\n");
        sb.append("voltage:").append(voltage);
        sb.append("\n");

        Message msg= mHandler.obtainMessage(1);
        msg.obj = sb.toString();
        mHandler.sendMessage(msg);
    }
}
}
主要接收該廣播需要用到權限:

<uses-permission android:name="android.permission.BATTERY_STATS"/>

  案例運行結果如下:

 

作者: 傑瑞教育
出處: http://www.cnblogs.com/jerehedu/ 
版權聲明:本文版權歸煙台傑瑞教育科技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
技術咨詢:JRedu技術交流
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM