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

技术咨询:
 

Android之PowerManager&BatteryManager的更多相关文章

  1. Android:PowerManager类 电源管理

    PowerManager类用于对设备电源状态进行管理:PowerManager.WakeLock类用于保持设备常亮:Android中通过各种Lock锁对电源进行控制,需要注意的是加锁和解锁必须成对出现 ...

  2. Android PowerManager电源管理(Android N )

    ./frameworks/base/core/java/android/os/PowerManager.java该类提供给Application访问电源相关接口. 它的内部类WakeLock是定义的唤 ...

  3. MTK Android 权限大全

    Android权限大全 1.android.permission.WRITE_USER_DICTIONARY允许应用程序向用户词典中写入新词 2.android.permission.WRITE_SY ...

  4. Android 监听锁屏、解锁、开屏 操作

    1.首先定义 ScreenListener  package com.app.lib; import android.content.BroadcastReceiver; import android ...

  5. [转]Android输出Log到文件

    前言:开发中遇到mx4这款机型Eclipse联调不上,logcat看不了,需要输出生成文件查看调试信息.网上搜了下,功能很完善了.startService和过滤输出信息需要自己添加设置,另外注意添加权 ...

  6. Android日志服务 记录日志

    转: http://easion-zms.iteye.com/blog/981568 import java.io.BufferedReader; import java.io.File; impor ...

  7. Android快捷开关实现(转)

    在Android源码中,提供的快捷开关相对是比较少的,Android4.0系统默认提供的桌面快捷开关AppWidget上只有5种开关(分别是Wifi开关.蓝牙开关.GPS开关.同步开关.亮度设置开关) ...

  8. 【Android代码片段之八】监听Android屏幕是否锁屏

    实现方法:1)通过BroadcastReceiver接收广播Intent.ACTION_SCREEN_ON和Intent.ACTION_SCREEN_OFF可以判断屏幕状态是否锁屏,但是只有屏幕状态发 ...

  9. Android电源管理-休眠简要分析

    一.开篇 1.Linux 描述的电源状态 - On(on)                                                 S0 -  Working - Standb ...

随机推荐

  1. gdg shell

    export TIMESTAMP=`date +%Y%m%d_%H%M%S`GDGFILE=file1_${TIMESTAMP}.txtsuffix=${GDGFILE#*_}prefix=${suf ...

  2. 配置k8s dns

    DNS (domain name system),提供域名解析服务,解决了难于记忆的IP地址问题,以更人性可读可记忆可标识的方式映射对应IP地址. Cluster DNS扩展插件用于支持k8s集群系统 ...

  3. Python字典使用--词频统计的GUI实现

    字典是针对非序列集合而提供的一种数据类型,字典中的数据是无序排列的. 字典的操作 为字典增加一项 dict[key] = value students = {"Z004":&quo ...

  4. C# 集合类-接口

    所谓,程序=数据结构+算法. 我目前的日常工作就是繁琐的业务流程和增删改查之类的. 其实繁琐的业务流程也不过是改变一下数据的状态.怪不得叫,面向数据库编程.哈哈. 所以呢,了解一下各种 .net内置的 ...

  5. Codeforces Beta Round #97 (Div. 1) C. Zero-One 数学

    C. Zero-One 题目连接: http://codeforces.com/contest/135/problem/C Description Little Petya very much lik ...

  6. vue父子组件使用时遇到的一个问题

    子组件一定要写在父组件之前,例如: //子vue,这里遇到一个坑,那就是子vue一定要写在父vue前面,不然会报错. Vue.component('todo-item', { template: $( ...

  7. Go语言Web框架gwk介绍 (一)

    今天看到Golang排名到前30名了,看来关注的人越来越多了,接下来几天详细介绍Golang一个web开发框架GWK. 现在博客园支持markdown格式发布文章么?后台的编辑器不太好用嘛. GWK ...

  8. cocos2d-x项目101次相遇:使用触摸事件移动 精灵

    cocos2d-x 101次相遇 / 文件夹  1   安装和环境搭建 -xcode  2   Scenes , Director, Layers, Sprites 3   建立图片菜单  4   在 ...

  9. A profile to detect when a SMS database has been changed

    http://webmail.dev411.com/t/gg/tasker/12bdddbsak/a-profile-to-detect-when-a-sms-has-been-sent A bela ...

  10. Red Hat Enterprise Linux 7.4配置VSFTP服务器

    vsftpd(very secure ftp daemon,非常安全的FTP守护进程)是一款运行在Linux操作系统上的FTP服务程序,不仅完全开源而且免费,此外,还具有很高的安全性.传输速度,以及支 ...