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/ 
版权声明:本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

技术咨询:

时间: 2024-10-13 12:11:52

Android之PowerManager&BatteryManager的相关文章

Android:PowerManager类 电源管理

PowerManager类用于对设备电源状态进行管理:PowerManager.WakeLock类用于保持设备常亮:Android中通过各种Lock锁对电源进行控制,需要注意的是加锁和解锁必须成对出现. 使用Activity的生命周期,以调用保持屏幕常亮和释放屏幕常亮动作. /** * <功能描述> 保持屏幕常亮 * * @return void [返回类型说明] */ private void keepScreenWake() { // 获取WakeLock锁,保持屏幕常亮 mPowerMa

Android提供的系统服务之--PowerManager(电源服务)

Android提供的系统服务之--PowerManager(电源服务) --转载请注明出处:coder-pig 本节引言: 本节主要讲解的Android为我们提供的系统服务中的:PowerManager电源管理的一个API, 用于管理CPU运行,键盘或者屏幕亮起来;不过,除非是迫不得已吧,不然的话,否则应该尽量避免 使用这个类,并且使用完以后一定要及时释放!本节并不太深入的去讲解,因为这个设计到底层的 一些东西,以后需要用到再深入研究,到时再另外写一篇blog总结!所以本节介绍的主要是 一些基本

Android开发笔记(一百一十七)app省电方略

电源管理PowerManager PowerManager是Android的电源管理类,用于管理电源操作如睡眠.唤醒.重启以及调节屏幕亮度等等. PowerManager的对象从系统服务POWER_SERVICE中获取,它的主要方法如下: goToSleep : 睡眠,即锁屏. wakeUp : 唤醒,即解锁. reboot : 重启. 另有下列几个隐藏的方法: getMinimumScreenBrightnessSetting : 获取屏幕亮度的最小值. getMaximumScreenBri

[深入理解Android卷二 全文-第五章]深入理解PowerManagerService

由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容 第5章  深入理解PowerManagerService 本章主要内容: ·  深入分析PowerManagerService ·  深入分析BatteryService和BatteryStatsService 本章所涉及的源代码文件名及位置: ·  PowerManagerService.java frame

Android一组WebView的随机,顺序,倒序加载

写了个应用,实现了一组WebView的顺序,倒序,和随机加载.之中使用了延时,为什么要使用呢?请看下图: package com.zms.csdngo; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiManager; i

转:Android 设置屏幕不待机

本文转载于:http://blog.csdn.net/yudajun/article/details/7748760 Android设置支部待机有两种方法 第一种简单通过设置WindowManager属性实现: 在Activity oncreat()方法中设置 getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 第

Android保持屏幕常亮

Android保持屏幕常亮,PowerManager.WakeLock的使用 package com.hebaijun.wakelock;      import android.app.Activity;   import android.os.Bundle;   import android.os.PowerManager;      public class WakeLockActivity extends Activity {       PowerManager.WakeLock wa

android wake lock 电源管理简单学习

需要配置清单文件:<uses-permission android:name="android.permission.WAKE_LOCK" /> 也可以参考我之前写的这篇文章: http://blog.csdn.net/aikongmeng/article/details/39232017 package com.example.wakeup; import android.annotation.SuppressLint; import android.app.Activi

Android 电源管理 -- wakelock机制

转载地址:http://blog.csdn.net/wh_19910525/article/details/8287202 Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠, 可以被用户态程序和内核获得. 这个锁可以是有超时的 或者 是没有超时的, 超时的锁会在时间过去以后自动解锁.如果没有锁了或者超时了, 内核就会启动休眠的那套机制来进入休眠. PowerManager.WakeLock 有加锁和解锁两种状态,加锁的方式有两种: 第一种是永久的锁住,这样的锁除非显式的