当我们想要更改后台数据的刷新速率来减少对用户影响的时候,先检测下当前的剩余电量和充电状态是个不错的开始。
在执行更新数据操作对用户电池寿命的影响取决于当前的剩余电量和充电状态。当设备在通过交流电充电的时候去更新数据对设备电池寿命的影响是微不足道的,所以在大部分情况下当设备在使用交流电充电的时候,您都可以最大化您的数据更新频率。相反的,如果设备没有在充电,减少更新速率会延长设备电池的使用寿命。
同样,您还可以检测电池电量信息,当剩余电量很少的时候,您可以减少更新频率 甚至停止更新。
检测当前的充电状态
BatteryManager
会广播所有的电池和充电详细信息,通过 Intent
可以获取这些状态。
由于这是个密集型(sticky)通知,所以您不需要注册一个 BroadcastReceiver
,只要简单的调用 registerReceiver
该函数并设置参数为 null
即可获得到包含了电池信息的Intent,当然您也可以设置一个 BroadcastReceiver
对象作为参数,我们会在后面小节中看到这种情况,暂时我们先设置其为null吧, 代码如下:
|
IntentFilter
ifilter
=
new
IntentFilter
(
Intent
.
ACTION_BATTERY_CHANGED
)
;
Intent
batteryStatus
=
context
.
registerReceiver
(
null
,
ifilter
)
;
|
如果当前设备正在充电的话,您还可以获取具体的充电方式 — 通过USB或者交流电充电:
|
// 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?
int
chargePlug
=
battery
.
getIntExtra
(
BatteryManager
.
EXTRA_PLUGGED
,
-
1
)
;
boolean
usbCharge
=
chargePlug
==
BATTERY_PLUGGED_USB
;
boolean
acCharge
=
chargePlug
==
BATTERY_PLUGGED_AC
;
|
当设备在使用交流电充电的时候,您可以最大化数据更新频率;如果在使用USB充电,您应该减少更新频率;如果没有在充电 更新频率应该更小。
检测充电状态的改变
设备是否充电是经常发生的,所以根据设备是否充电来修改更新频率是非常重要的。
无论设备充电或者停止充电 BatteryManager
都会广播一个消息。即使您的程序没有正在运行也应该监听这个事件,这样您可以根据不同的状态来判断是否需要启动后台更新程序。您可以在Manifest文件中注册一个同时监听 ACTION_POWER_CONNECTED
和 ACTION_POWER_DISCONNECTED
消息的 BroadcastReceiver
。
|
<
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
实现中,可以查询当前的状态。
1
2
3
4
5
6
7
8
9
10
11
12
|
public
class
PowerConnectionReceiver
extends
BroadcastReceiver
{
@Override
public
void
onReceive
(
Context
context
,
Intent
intent
)
{
int
status
=
intent
.
getIntExtra
(
BatteryManager
.
EXTRA_STATUS
,
-
1
)
;
boolean
isCharging
=
status
==
BatteryManager
.
BATTERY_STATUS_CHARGING
||
status
==
BatteryManager
.
BATTERY_STATUS_FULL
;
int
chargePlug
=
intent
.
getIntExtra
(
BatteryManager
.
EXTRA_PLUGGED
,
-
1
)
;
boolean
usbCharge
=
chargePlug
==
BATTERY_PLUGGED_USB
;
boolean
acCharge
=
chargePlug
==
BATTERY_PLUGGED_AC
;
}
}
|
检测当前剩余电量
有些情况下根据当前剩余电量做些改动也是有用的。当电量低于一定值的时候可以修改后台数据的更新频率。
您可以通过如下示例代码来获取剩余电量信息:
|
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过滤器。
|
<
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
>
|
一般来说,当电量极其少的时候,关闭后台数据更新是个不错的做法。当用户没电关机了您的数据再新都没有意义哇。
有些情况下设备会放到底座上使用,下节课程会讲述如何判断当前的底座状态以及检测底座的变化。
Read more: http://blog.chengyunfeng.com/?p=274#ixzz4SiTcekUp