当我们想要更改后台数据的刷新速率来减少对用户影响的时候,先检测下当前的剩余电量和充电状态是个不错的开始。
在执行更新数据操作对用户电池寿命的影响取决于当前的剩余电量和充电状态。当设备在通过交流电充电的时候去更新数据对设备电池寿命的影响是微不足道的,所以在大部分情况下当设备在使用交流电充电的时候,您都可以最大化您的数据更新频率。相反的,如果设备没有在充电,减少更新速率会延长设备电池的使用寿命。
同样,您还可以检测电池电量信息,当剩余电量很少的时候,您可以减少更新频率 甚至停止更新。
检测当前的充电状态
BatteryManager
会广播所有的电池和充电详细信息,通过Intent
可以获取这些状态。
由于这是个密集型(sticky)通知,所以您不需要注册一个BroadcastReceiver
,只要简单的调用registerReceiver
该函数并设置参数为null
即可获得到包含了电池信息的Intent,当然您也可以设置一个BroadcastReceiver
对象作为参数,我们会在后面小节中看到这种情况,暂时我们先设置其为null吧, 代码如下:
Java
12 |
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);Intent batteryStatus = context.registerReceiver(null, ifilter); |
如果当前设备正在充电的话,您还可以获取具体的充电方式 — 通过USB或者交流电充电:
Java
123456789 |
// Are we charging / charged?intstatus=batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS,-1);booleanisCharging=status==BatteryManager.BATTERY_STATUS_CHARGING||status==BatteryManager.BATTERY_STATUS_FULL;// How are we charging?intchargePlug=battery.getIntExtra(BatteryManager.EXTRA_PLUGGED,-1);booleanusbCharge=chargePlug==BATTERY_PLUGGED_USB;booleanacCharge=chargePlug==BATTERY_PLUGGED_AC; |
当设备在使用交流电充电的时候,您可以最大化数据更新频率;如果在使用USB充电,您应该减少更新频率;如果没有在充电 更新频率应该更小。
检测充电状态的改变
设备是否充电是经常发生的,所以根据设备是否充电来修改更新频率是非常重要的。
无论设备充电或者停止充电BatteryManager
都会广播一个消息。即使您的程序没有正在运行也应该监听这个事件,这样您可以根据不同的状态来判断是否需要启动后台更新程序。您可以在Manifest文件中注册一个同时监听ACTION_POWER_CONNECTED
和ACTION_POWER_DISCONNECTED
消息的BroadcastReceiver
。
Java
123456 |
<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> |
在这个BroadcastReceiver
实现中,可以查询当前的状态。
Java
123456789101112 |
publicclassPowerConnectionReceiverextendsBroadcastReceiver{@OverridepublicvoidonReceive(Contextcontext,Intentintent){intstatus=intent.getIntExtra(BatteryManager.EXTRA_STATUS,-1);booleanisCharging=status==BatteryManager.BATTERY_STATUS_CHARGING||status==BatteryManager.BATTERY_STATUS_FULL;intchargePlug=intent.getIntExtra(BatteryManager.EXTRA_PLUGGED,-1);booleanusbCharge=chargePlug==BATTERY_PLUGGED_USB;booleanacCharge=chargePlug==BATTERY_PLUGGED_AC;}} |
检测当前剩余电量
有些情况下根据当前剩余电量做些改动也是有用的。当电量低于一定值的时候可以修改后台数据的更新频率。
您可以通过如下示例代码来获取剩余电量信息:
Java
1234 |
int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1);float batteryPct = level / (float)scale; |
检测明显的电量改变
你无法很轻松的检查连续的电池状态改变,而且您也无需这么做。
一般来说,联系的检查电量信息可能比您后台更新数据还要费电,所以只监听一些重要的电量状态比较有意义,例如监听合适设备进入或者离开低电状态。
下面的示例代码中的Receiver只监听设备进入低电状态或者离开低电状态的变化;使用了ACTION_BATTERY_LOW
和ACTION_BATTERY_OKAY
这两个Intent过滤器。
Java
123456 |
<receiverandroid:name=".BatteryLevelReceiver"><intent-filter><actionandroid:name="android.intent.action.ACTION_BATTERY_LOW"/><actionandroid:name="android.intent.action.ACTION_BATTERY_OKAY"/></intent-filter></receiver> |
一般来说,当电量极其少的时候,关闭后台数据更新是个不错的做法。当用户没电关机了您的数据再新都没有意义哇。
有些情况下设备会放到底座上使用,下节课程会讲述如何判断当前的底座状态以及检测底座的变化。
Read more:http://blog.chengyunfeng.com/?p=274#ixzz4SiTcekUp
- android OSChina 客户端源代码剖析
- android代码混淆 GSON完满解决
- Android开源代码解读の地图照片应用Panoramio的实现详解(六)
- 在app引擎端点的启动时执行代码
- javaScript函数中执行C#代码中的函数
- 反编译APK 得到JAVA代码和资源文件源码
- java.io.File vs java.nio.Files这是新代码中的首选?
- 拖动层的javasvript代码 十行代码即可写出兼容版拖动层
- 我无法让这个简单的ajax代码工作
随机推荐
-
【Android】RelativeLayout相对布局属性
-
android下eclipse中This LinearLayout la
-
android布局RelativeLayout中android:gra
-
Android 开发————1、Android基础简介
-
Android Trick 2: Android中的透明属性的
-
Android UI之GridView
-
Android 中启动自己另一个程序的activity
-
Android:安卓资源引用符号的含义
-
【译】Android系统简介
-
[Google Android] Android SDK Tools, Re