http://developer.android.com/training/monitoring-device-state/index.html
http://developer.android.com/training/monitoring-device-state/battery-monitoring.html

0. stickey 广播

系统会发一些 "sticky" 的广播,send出来后会一直保留着,当调用 registerReceiver 方法的 IntentFilter 符合其要求时,
就会返回这个广播,就像新广播的一样。

这时调用registerReceiver 传入的 receiver 可为null, 直接返回广播的Intent。如下面获取电池状态的方法。

若没有,返回null,有多个 "sticky"广播符合 IntentFilter 时,由系统决定返回哪一个。

只能动态代码注册接收的广播:

Intent.ACTION_BATTERY_CHANGED

可以静态注册注册接收的广播:

android.intent.action.ACTION_POWER_CONNECTED

android.intent.action.ACTION_POWER_DISCONNECTED

android.intent.action.ACTION_BATTERY_LOW

android.intent.action.ACTION_BATTERY_OKAY

1. 监听充电状态,电池状态

一般在AC充电器充电的时候,可以加快后台的更新速率,USB充电的时候要减小,用电池的时候要更低。

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = mContext.registerReceiver(null, ifilter); // Are we charging / charged? 是否正在充电,是否充满
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; // How are we charging? 用什么线充电,USB还是AC线
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; //可返回这些信息,有电量,电池类型等等:
// [icon-small=17302814, scale=100, present=true, technology=Li-poly, level=97,
// voltage=4206, status=2, invalid_charger=0, plugged=2, health=2, temperature=310] //当前剩余百分之多少的电量:
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float batteryPct = level / (float)scale;

PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。
 SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯
 SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,允许保持屏幕高亮显示,允许关闭键盘灯
 FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度
 ACQUIRE_CAUSES_WAKEUP:强制使屏幕亮起,这种锁主要针对一些必须通知用户的操作.
 ON_AFTER_RELEASE:当锁被释放时,保持屏幕亮起一段时间

用静态广播的方法:

Receiver接受到的Intent同上所述。

也可以用静态注册的广播来监听充电状态:
<receiver android:name=".PowerConnectionReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
</intent-filter>
</receiver> 监听电量变低或者充满的广播:
<receiver android:name=".BatteryLevelReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_BATTERY_LOW"/>
<action android:name="android.intent.action.ACTION_BATTERY_OKAY"/>
</intent-filter>
</receiver>

2. Determining and Monitoring the Docking State and Type

//Intent.ACTION_DOCK_EVENT也是个 "sticky" 的广播。
IntentFilter ifilter = new IntentFilter(Intent.ACTION_DOCK_EVENT);
Intent dockStatus = context.registerReceiver(null, ifilter); int dockState = dockStatus.getIntExtra(Intent.EXTRA_DOCK_STATE, -1);
boolean isDocked = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED; boolean isCar = dockState == Intent.EXTRA_DOCK_STATE_CAR;
boolean isDesk = dockState == Intent.EXTRA_DOCK_STATE_DESK ||
dockState == Intent.EXTRA_DOCK_STATE_LE_DESK ||
dockState == Intent.EXTRA_DOCK_STATE_HE_DESK;

.Car
.Desk
.Low-End (Analog) Desk
.High-End (Digital) Desk
Note that the latter two options were only introduced to Android in API level 11

权限:

<action android:name="android.intent.action.ACTION_DOCK_EVENT"/>

3. 监听和获取网络连接的状态。

如果网络不通就没必要在后台去访问网络。

ConnectivityManager cm =(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;

//监听网络变化,这个广播会触发得比较频繁,从net->wifi 或者相反都会触发。
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>

4. 动态的开启或者关闭 广播接收器

可以根据需要来设置receiver 是否要工作,这种方式设置后,即使重启手机了也是有效的。

ComponentName receiver = new ComponentName(context, myReceiver.class);
PackageManager pm = context.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
/方法原型
public void setComponentEnabledSetting(ComponentName componentName, int newState, int flags);

newState
The new enabled state for the component. The legal values for this state are:
COMPONENT_ENABLED_STATE_ENABLED,
COMPONENT_ENABLED_STATE_DISABLED,
COMPONENT_ENABLED_STATE_DEFAULT
The last one removes the setting, thereby restoring the component's state to whatever was set in it's manifest (or enabled, by default). flags
Optional behavior flags:
DONT_KILL_APP or 0. DONT_KILL_APP
to indicate that you don't want to kill the app containing the component.
Be careful when you set this since changing component states can make the containing application's behavior unpredictable.

Best Practices for Performance_4.Optimizing Battery Life 获取充电状态、电池信息,"sticky"类型的广播的更多相关文章

  1. 获取响应状态Status信息、获取状态码Status Code

    一般服务器的响应状态有以下几种: 200 正常 400 未找到页面 403 拒绝 500 服务器错误 比如我们请求bootstrap中文网, 此时的状态码是200 OK表示正常,后面的from cac ...

  2. 调用手机在线API获取手机号码归属地信息

    手机在线(www.showji.com)始创于2001年,发展至今已拥有国内最准确.号段容量最大的手机号码归属地数据库系统, 目前号段容量将近33万条,每月保持两次以上规模数据更新,合作伙伴包括:百度 ...

  3. iOS 获取网络状态

    在iOS开发者,获取网络状态比较常用 -(NSString *)getNetWorkStates{ UIApplication *app = [UIApplication sharedApplicat ...

  4. C# 获取时间差状态

    /// <summary> /// 根据时间获取时间状态 /// </summary> /// <param name="dt"></pa ...

  5. php正则获取html图片标签信息(采集图片)

    php获取html图片标签信息(采集图片),实现图片采集及其他功能,带代码如下: <?php $str="<img src='./a.jpg'/>111111<img ...

  6. asp.net C#获取程序文件相关信息

    代码如下 复制代码 using System.Reflection;using System.Runtime.CompilerServices; //// 有关程序集的常规信息是通过下列// 属性集控 ...

  7. 使用navigator.geolocation来获取用户的地理位置信息

    使用navigator.geolocation来获取用户的地理位置信息 W3C 中新添加了一个名为 Geolocation的 API 规范,Geoloaction API的作用就是通过浏览器获取用户的 ...

  8. Android 通过广播获取网络状态

    Android系统网络连接状态的改变会发一个广播,注册一个广播接收者,实时动态的检测网络状态,及时提醒用户,优化用户体验.          本文仅提供WIFI 状态的检测作为参考,其他网络连接方式请 ...

  9. .NET获取枚举DescriptionAttribute描述信息性能改进的多种方法

    一. DescriptionAttribute的普通使用方式 1.1 使用示例 DescriptionAttribute特性可以用到很多地方,比较常见的就是枚举,通过获取枚举上定义的描述信息在UI上显 ...

随机推荐

  1. jquery jqPlot API 中文使用教程

    jqPlot是一个灰常强大的图表工具,曲线,柱状,饼图,应该有尽有,更要命的是,调用方便~~ 官网:http://www.jqplot.com/ 这里贡献上中文教程,基本上所有的api都很齐全,供有需 ...

  2. WAMPserver配置(允许外部访问、phpmyadmin设置为输入用户名密码才可登录等)

    对于很多不熟悉PHP环境安装的朋友来说,用集成环境可以更快的上手,更方便的搭建PHP的运行环境,但是,WAMP的集成环境仅仅是将底层基础工作做好 了,有些个别关键的配置操作并没有集成到环境安装中,所以 ...

  3. 7、provider: SQL 网络接口, error: 26 - 定位指定的服务器/实例时出错

    在建立与服务器的连接时出错.在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败.(provider: SQL 网络接口, error ...

  4. IOS 关于NSString类型的属性为什么有时用copy,有时用strong呢?

    对于很多初学者,发现在修饰NSString类型的对象时,会有这样的疑惑?怎么有些人用strong修饰,而有些人用copy修饰呢? 这里有个例子,一.首先声明2个属性: @property (nonat ...

  5. 缓存和sd卡的路径(原)

    在需要存储的时候,路径的问题是初学者比较迷惑的,下面是对于getCacheDir().getFilesDir().getExternalFilesDir().getExternalCacheDir() ...

  6. MVC+UnitOfWork+Repository+EF 之我见

    UnitOfWork+Repository模式简介: 每次提交数据库都会打开一个连接,造成结果是:多个连接无法共用一个数据库级别的事务,也就无法保证数据的原子性.一致性.解决办法是:在Reposito ...

  7. IOS设备 UIDevice 获取操作系统 版本 电量 临近手机触发消息检测 (真机亲测可用)

    - (void)viewDidLoad { [super viewDidLoad]; // 操作系统 NSString * osName =[[UIDevice currentDevice]syste ...

  8. 【JS】FOR循环通关只循环一次length提高性能

    问题来源于jqueryAPI 原文: Iteration An array has a length property that is useful for iteration: for ( var ...

  9. Java 在指定目录建立指定文件名的文件 并输入内容

    package runoob; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream ...

  10. 我的第一份供lua调用的c模块

    #include <stdio.h> #include <string> #include <direct.h> #include <windows.h> ...