Android 电量变化监听
2017-09-14 11:23
337 查看
Intent.ACTION_BATTERY_CHANGED
This is a sticky broadcast containing the charging state,
level, and other information about the battery. See
documentation on the contents of the Intent.
你不能像组件那样在manifests里声明一个receive ,你只能通过Context.registerReceiver()注册。.
See
and
broadcasts that are sent and can be received through manifest receivers.
This is a protected intent that can only be sent by the system.
Constant Value: "android.intent.action.BATTERY_CHANGED"
如果我们注册了对Intent.ACTION_BATTERY_CHANGED的监听,那么我们马上会收到一个Action为Intent.ACTION_BATTERY_CHANGED的intent,之后只要我们没有取消监听,一定电池发送变化,我们也会收到这样的intent。电池的信息,电压,温度,充电状态等等,都是由BatteryService来提供的。电池的这些信息是BatteryService通过广播
主动把数据传送给所关心的应用程序。
通过该intent的extra我们可以取得电池的很多信息,比如电压可以用如下的方式:voltage=intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);
BatteryManager类列出了该intent的extra所包含的信息:
String EXTRA_HEALTH :
integer.它表示当前电池的健康状态。
可能的值为:
int BATTERY_HEALTH_COLD
int BATTERY_HEALTH_DEAD
int BATTERY_HEALTH_GOOD
int BATTERY_HEALTH_OVERHEAT
int BATTERY_HEALTH_OVER_VOLTAGE
int BATTERY_HEALTH_UNKNOWN
int BATTERY_HEALTH_UNSPECIFIED_FAILURE
String EXTRA_ICON_SMALL :
integer.the resource ID of a small status bar icon indicating the current battery state.
它是当前用于表示电池状态的icon的资源id.
String EXTRA_LEVEL:
integer.它表示电池当前的电量, 它介于0和
String EXTRA_PLUGGED :
integer.它表示当前手机使用的是哪里的电源。
可能的值有:
0:表示电源是电池
int BATTERY_PLUGGED_AC :表示电源是AC
charger.[应该是指充电器]。
int BATTERY_PLUGGED_USB :表示电源是USB
port.
String EXTRA_PRESENT:
boolean.表示是否提供电池。有些手机在使用USB电源的情况下,即使拔出了电池,仍然可以正常工作。
String EXTRA_SCALE:
integer.表示电池电量的最大值.
String EXTRA_STATUS :
integer。表示电池的当前状态。
可能的值为:
int BATTERY_STATUS_CHARGING 表示正在充电。
int BATTERY_STATUS_DISCHARGING
int BATTERY_STATUS_FULL 表示充满
int BATTERY_STATUS_NOT_CHARGING 表示没有充电
int BATTERY_STATUS_UNKNOWN表示未知状态。
String EXTRA_TECHNOLOGY :表示电池使用的技术。比如,对于锂电池是Li-ion.
String EXTRA_TEMPERATURE:integer
。表示当前电池的温度。
String EXTRA_VOLTAGE :
integer。表示当前电池的电压。.
另外还有两种intent专门用于表示电量低的情况
ACTION_BATTERY_LOW :表示当前电池电量低。
ACTION_BATTERY_OKAY:表示当前电池已经从电量低恢复为正常。
当你在更改后台更新频率来减少这些更新对电池寿命的影响时,检查当前电量和充电状态是一个好的开始。
电池寿命通过剩余电量和充电状态来影响应用更新的执行。当用交流电充电时,执行更新操作对设备的影响是微不足道的,所以在大多数案例里,你可以把更新频率调到最快。如果设备不在充电,降低更新频率可以帮助延长电池寿命。
类似的,你可以检查电池剩余电量级别,在电量低时,应该降低更新频率甚至停止更新。
注:此处的更新,指的是类似发送心跳包的动作,或者定时更新内容。并非仅仅指更新应用版本。如果是用户动作,比如翻页刷新,不需要根据电量和充电状态处理。
通过判断当前充电状态开始。BatteryManager会通过一个intent广播所有电池和充电详情,包含充电状态。
因为这是一个sticky intent,你不需要注册广播接收器。简单地通过调用 registerReceiver,像下面的代码段传入一个null的接收器,当前电池状态的intent就会返回。你也可以传入一个真实的接收器对象,但我们暂时不会操作更新,所以这是没必要的。
通常你应该在使用交流电充电时最大化后台更新频率,在使用usb充电时降低,不充电时更低。
充电状态很容易改变(插入/拔出充电器),所以监听充电状态,更改刷新频率很重要。
充电状态改变时,BatteryManager会发一个广播。接收这些事件很重要,甚至在应用没有运行的时候,因为可能你需要后台开启更新服务。所以,在Androidmanifest.xml里注册广播接收器,加上两个action:ACTION_POWER_CONNECTED 和ACTION_POWER_DISCONNECTED作为过滤。
在关联的广播接收器实现里,你可以读出当前充电状态,方法跟上一步说的相同:
在某些案例里,判断当前剩余电量同样很有用。如果电量在某些水平之下,你可能会选择降低后台更新频率。
你可以用下面的代码读到电量:
持续监听电池状态不容易,但你不必这么做。
一般来说,持续监听电池电量对电池的影响比app的正常行为还要大。所以,只监听剩余电量的指定级别的改变(进入或离开低电量状态)是一个很好的实践。
manifest里声明的接收器,会在进入或离开低电量状态时触发。
剩余电量严重不足时,最好禁用所有后台更新。在你可以使用手机之前就关机了,这种情况下,如果刷新数据并不重要。
在很多情况下,设备是是插入到底座里充电的(好吧,反正我没见几个人额外花钱买底座的,可能国外较多)。下节讲怎么判断当前底座状态和监听插入底座时改变。
Intent.ACTION_BATTERY_CHANGED
This is a sticky broadcast containing the charging state,
level, and other information about the battery. See
documentation on the contents of the Intent.
你不能像组件那样在manifests里声明一个receive ,你只能通过Context.registerReceiver()注册。.
See
and
broadcasts that are sent and can be received through manifest receivers.
This is a protected intent that can only be sent by the system.
Constant Value: "android.intent.action.BATTERY_CHANGED"
如果我们注册了对Intent.ACTION_BATTERY_CHANGED的监听,那么我们马上会收到一个Action为Intent.ACTION_BATTERY_CHANGED的intent,之后只要我们没有取消监听,一定电池发送变化,我们也会收到这样的intent。电池的信息,电压,温度,充电状态等等,都是由BatteryService来提供的。电池的这些信息是BatteryService通过广播
主动把数据传送给所关心的应用程序。
通过该intent的extra我们可以取得电池的很多信息,比如电压可以用如下的方式:voltage=intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);
BatteryManager类列出了该intent的extra所包含的信息:
String EXTRA_HEALTH :
integer.它表示当前电池的健康状态。
可能的值为:
int BATTERY_HEALTH_COLD
int BATTERY_HEALTH_DEAD
int BATTERY_HEALTH_GOOD
int BATTERY_HEALTH_OVERHEAT
int BATTERY_HEALTH_OVER_VOLTAGE
int BATTERY_HEALTH_UNKNOWN
int BATTERY_HEALTH_UNSPECIFIED_FAILURE
String EXTRA_ICON_SMALL :
integer.the resource ID of a small status bar icon indicating the current battery state.
它是当前用于表示电池状态的icon的资源id.
String EXTRA_LEVEL:
integer.它表示电池当前的电量, 它介于0和
String EXTRA_PLUGGED :
integer.它表示当前手机使用的是哪里的电源。
可能的值有:
0:表示电源是电池
int BATTERY_PLUGGED_AC :表示电源是AC
charger.[应该是指充电器]。
int BATTERY_PLUGGED_USB :表示电源是USB
port.
String EXTRA_PRESENT:
boolean.表示是否提供电池。有些手机在使用USB电源的情况下,即使拔出了电池,仍然可以正常工作。
String EXTRA_SCALE:
integer.表示电池电量的最大值.
String EXTRA_STATUS :
integer。表示电池的当前状态。
可能的值为:
int BATTERY_STATUS_CHARGING 表示正在充电。
int BATTERY_STATUS_DISCHARGING
int BATTERY_STATUS_FULL 表示充满
int BATTERY_STATUS_NOT_CHARGING 表示没有充电
int BATTERY_STATUS_UNKNOWN表示未知状态。
String EXTRA_TECHNOLOGY :表示电池使用的技术。比如,对于锂电池是Li-ion.
String EXTRA_TEMPERATURE:integer
。表示当前电池的温度。
String EXTRA_VOLTAGE :
integer。表示当前电池的电压。.
另外还有两种intent专门用于表示电量低的情况
ACTION_BATTERY_LOW :表示当前电池电量低。
ACTION_BATTERY_OKAY:表示当前电池已经从电量低恢复为正常。
当你在更改后台更新频率来减少这些更新对电池寿命的影响时,检查当前电量和充电状态是一个好的开始。
电池寿命通过剩余电量和充电状态来影响应用更新的执行。当用交流电充电时,执行更新操作对设备的影响是微不足道的,所以在大多数案例里,你可以把更新频率调到最快。如果设备不在充电,降低更新频率可以帮助延长电池寿命。
类似的,你可以检查电池剩余电量级别,在电量低时,应该降低更新频率甚至停止更新。
注:此处的更新,指的是类似发送心跳包的动作,或者定时更新内容。并非仅仅指更新应用版本。如果是用户动作,比如翻页刷新,不需要根据电量和充电状态处理。
通过判断当前充电状态开始。BatteryManager会通过一个intent广播所有电池和充电详情,包含充电状态。
因为这是一个sticky intent,你不需要注册广播接收器。简单地通过调用 registerReceiver,像下面的代码段传入一个null的接收器,当前电池状态的intent就会返回。你也可以传入一个真实的接收器对象,但我们暂时不会操作更新,所以这是没必要的。
通常你应该在使用交流电充电时最大化后台更新频率,在使用usb充电时降低,不充电时更低。
充电状态很容易改变(插入/拔出充电器),所以监听充电状态,更改刷新频率很重要。
充电状态改变时,BatteryManager会发一个广播。接收这些事件很重要,甚至在应用没有运行的时候,因为可能你需要后台开启更新服务。所以,在Androidmanifest.xml里注册广播接收器,加上两个action:ACTION_POWER_CONNECTED 和ACTION_POWER_DISCONNECTED作为过滤。
在关联的广播接收器实现里,你可以读出当前充电状态,方法跟上一步说的相同:
在某些案例里,判断当前剩余电量同样很有用。如果电量在某些水平之下,你可能会选择降低后台更新频率。
你可以用下面的代码读到电量:
持续监听电池状态不容易,但你不必这么做。
一般来说,持续监听电池电量对电池的影响比app的正常行为还要大。所以,只监听剩余电量的指定级别的改变(进入或离开低电量状态)是一个很好的实践。
manifest里声明的接收器,会在进入或离开低电量状态时触发。
剩余电量严重不足时,最好禁用所有后台更新。在你可以使用手机之前就关机了,这种情况下,如果刷新数据并不重要。
在很多情况下,设备是是插入到底座里充电的(好吧,反正我没见几个人额外花钱买底座的,可能国外较多)。下节讲怎么判断当前底座状态和监听插入底座时改变。
参考:
http://www.android-doc.com/reference/android/os/BatteryManager.html
This is a sticky broadcast containing the charging state,
level, and other information about the battery. See
BatteryManagerfor
documentation on the contents of the Intent.
你不能像组件那样在manifests里声明一个receive ,你只能通过Context.registerReceiver()注册。.
See
ACTION_BATTERY_LOW,
ACTION_BATTERY_OKAY,
ACTION_POWER_CONNECTED,
and
ACTION_POWER_DISCONNECTEDfor distinct battery-related
broadcasts that are sent and can be received through manifest receivers.
This is a protected intent that can only be sent by the system.
Constant Value: "android.intent.action.BATTERY_CHANGED"
如果我们注册了对Intent.ACTION_BATTERY_CHANGED的监听,那么我们马上会收到一个Action为Intent.ACTION_BATTERY_CHANGED的intent,之后只要我们没有取消监听,一定电池发送变化,我们也会收到这样的intent。电池的信息,电压,温度,充电状态等等,都是由BatteryService来提供的。电池的这些信息是BatteryService通过广播
主动把数据传送给所关心的应用程序。
通过该intent的extra我们可以取得电池的很多信息,比如电压可以用如下的方式:voltage=intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);
BatteryManager类列出了该intent的extra所包含的信息:
String EXTRA_HEALTH :
integer.它表示当前电池的健康状态。
可能的值为:
int BATTERY_HEALTH_COLD
int BATTERY_HEALTH_DEAD
int BATTERY_HEALTH_GOOD
int BATTERY_HEALTH_OVERHEAT
int BATTERY_HEALTH_OVER_VOLTAGE
int BATTERY_HEALTH_UNKNOWN
int BATTERY_HEALTH_UNSPECIFIED_FAILURE
String EXTRA_ICON_SMALL :
integer.the resource ID of a small status bar icon indicating the current battery state.
它是当前用于表示电池状态的icon的资源id.
String EXTRA_LEVEL:
integer.它表示电池当前的电量, 它介于0和
EXTRA_SCALE之间.
String EXTRA_PLUGGED :
integer.它表示当前手机使用的是哪里的电源。
可能的值有:
0:表示电源是电池
int BATTERY_PLUGGED_AC :表示电源是AC
charger.[应该是指充电器]。
int BATTERY_PLUGGED_USB :表示电源是USB
port.
String EXTRA_PRESENT:
boolean.表示是否提供电池。有些手机在使用USB电源的情况下,即使拔出了电池,仍然可以正常工作。
String EXTRA_SCALE:
integer.表示电池电量的最大值.
String EXTRA_STATUS :
integer。表示电池的当前状态。
可能的值为:
int BATTERY_STATUS_CHARGING 表示正在充电。
int BATTERY_STATUS_DISCHARGING
int BATTERY_STATUS_FULL 表示充满
int BATTERY_STATUS_NOT_CHARGING 表示没有充电
int BATTERY_STATUS_UNKNOWN表示未知状态。
String EXTRA_TECHNOLOGY :表示电池使用的技术。比如,对于锂电池是Li-ion.
String EXTRA_TEMPERATURE:integer
。表示当前电池的温度。
String EXTRA_VOLTAGE :
integer。表示当前电池的电压。.
另外还有两种intent专门用于表示电量低的情况
ACTION_BATTERY_LOW :表示当前电池电量低。
ACTION_BATTERY_OKAY:表示当前电池已经从电量低恢复为正常。
当你在更改后台更新频率来减少这些更新对电池寿命的影响时,检查当前电量和充电状态是一个好的开始。
电池寿命通过剩余电量和充电状态来影响应用更新的执行。当用交流电充电时,执行更新操作对设备的影响是微不足道的,所以在大多数案例里,你可以把更新频率调到最快。如果设备不在充电,降低更新频率可以帮助延长电池寿命。
类似的,你可以检查电池剩余电量级别,在电量低时,应该降低更新频率甚至停止更新。
注:此处的更新,指的是类似发送心跳包的动作,或者定时更新内容。并非仅仅指更新应用版本。如果是用户动作,比如翻页刷新,不需要根据电量和充电状态处理。
判断当前充电状态
通过判断当前充电状态开始。BatteryManager会通过一个intent广播所有电池和充电详情,包含充电状态。因为这是一个sticky intent,你不需要注册广播接收器。简单地通过调用 registerReceiver,像下面的代码段传入一个null的接收器,当前电池状态的intent就会返回。你也可以传入一个真实的接收器对象,但我们暂时不会操作更新,所以这是没必要的。
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter); //你可以读到充电状态,如果在充电,可以读到是usb还是交流电 // 是否在充电 int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; // 怎么充 int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
通常你应该在使用交流电充电时最大化后台更新频率,在使用usb充电时降低,不充电时更低。
监听充电状态的改变
充电状态很容易改变(插入/拔出充电器),所以监听充电状态,更改刷新频率很重要。充电状态改变时,BatteryManager会发一个广播。接收这些事件很重要,甚至在应用没有运行的时候,因为可能你需要后台开启更新服务。所以,在Androidmanifest.xml里注册广播接收器,加上两个action:ACTION_POWER_CONNECTED 和ACTION_POWER_DISCONNECTED作为过滤。
<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>
在关联的广播接收器实现里,你可以读出当前充电状态,方法跟上一步说的相同:
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 == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; } }
判断当前剩余电量
在某些案例里,判断当前剩余电量同样很有用。如果电量在某些水平之下,你可能会选择降低后台更新频率。你可以用下面的代码读到电量:
//当前剩余电量 int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); //电量最大值 int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); //电量百分比 float batteryPct = level / (float)scale;
监听剩余电量显著改变
持续监听电池状态不容易,但你不必这么做。一般来说,持续监听电池电量对电池的影响比app的正常行为还要大。所以,只监听剩余电量的指定级别的改变(进入或离开低电量状态)是一个很好的实践。
manifest里声明的接收器,会在进入或离开低电量状态时触发。
<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>
剩余电量严重不足时,最好禁用所有后台更新。在你可以使用手机之前就关机了,这种情况下,如果刷新数据并不重要。
在很多情况下,设备是是插入到底座里充电的(好吧,反正我没见几个人额外花钱买底座的,可能国外较多)。下节讲怎么判断当前底座状态和监听插入底座时改变。
Intent.ACTION_BATTERY_CHANGED
This is a sticky broadcast containing the charging state,
level, and other information about the battery. See
BatteryManagerfor
documentation on the contents of the Intent.
你不能像组件那样在manifests里声明一个receive ,你只能通过Context.registerReceiver()注册。.
See
ACTION_BATTERY_LOW,
ACTION_BATTERY_OKAY,
ACTION_POWER_CONNECTED,
and
ACTION_POWER_DISCONNECTEDfor distinct battery-related
broadcasts that are sent and can be received through manifest receivers.
This is a protected intent that can only be sent by the system.
Constant Value: "android.intent.action.BATTERY_CHANGED"
如果我们注册了对Intent.ACTION_BATTERY_CHANGED的监听,那么我们马上会收到一个Action为Intent.ACTION_BATTERY_CHANGED的intent,之后只要我们没有取消监听,一定电池发送变化,我们也会收到这样的intent。电池的信息,电压,温度,充电状态等等,都是由BatteryService来提供的。电池的这些信息是BatteryService通过广播
主动把数据传送给所关心的应用程序。
通过该intent的extra我们可以取得电池的很多信息,比如电压可以用如下的方式:voltage=intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);
BatteryManager类列出了该intent的extra所包含的信息:
String EXTRA_HEALTH :
integer.它表示当前电池的健康状态。
可能的值为:
int BATTERY_HEALTH_COLD
int BATTERY_HEALTH_DEAD
int BATTERY_HEALTH_GOOD
int BATTERY_HEALTH_OVERHEAT
int BATTERY_HEALTH_OVER_VOLTAGE
int BATTERY_HEALTH_UNKNOWN
int BATTERY_HEALTH_UNSPECIFIED_FAILURE
String EXTRA_ICON_SMALL :
integer.the resource ID of a small status bar icon indicating the current battery state.
它是当前用于表示电池状态的icon的资源id.
String EXTRA_LEVEL:
integer.它表示电池当前的电量, 它介于0和
EXTRA_SCALE之间.
String EXTRA_PLUGGED :
integer.它表示当前手机使用的是哪里的电源。
可能的值有:
0:表示电源是电池
int BATTERY_PLUGGED_AC :表示电源是AC
charger.[应该是指充电器]。
int BATTERY_PLUGGED_USB :表示电源是USB
port.
String EXTRA_PRESENT:
boolean.表示是否提供电池。有些手机在使用USB电源的情况下,即使拔出了电池,仍然可以正常工作。
String EXTRA_SCALE:
integer.表示电池电量的最大值.
String EXTRA_STATUS :
integer。表示电池的当前状态。
可能的值为:
int BATTERY_STATUS_CHARGING 表示正在充电。
int BATTERY_STATUS_DISCHARGING
int BATTERY_STATUS_FULL 表示充满
int BATTERY_STATUS_NOT_CHARGING 表示没有充电
int BATTERY_STATUS_UNKNOWN表示未知状态。
String EXTRA_TECHNOLOGY :表示电池使用的技术。比如,对于锂电池是Li-ion.
String EXTRA_TEMPERATURE:integer
。表示当前电池的温度。
String EXTRA_VOLTAGE :
integer。表示当前电池的电压。.
另外还有两种intent专门用于表示电量低的情况
ACTION_BATTERY_LOW :表示当前电池电量低。
ACTION_BATTERY_OKAY:表示当前电池已经从电量低恢复为正常。
当你在更改后台更新频率来减少这些更新对电池寿命的影响时,检查当前电量和充电状态是一个好的开始。
电池寿命通过剩余电量和充电状态来影响应用更新的执行。当用交流电充电时,执行更新操作对设备的影响是微不足道的,所以在大多数案例里,你可以把更新频率调到最快。如果设备不在充电,降低更新频率可以帮助延长电池寿命。
类似的,你可以检查电池剩余电量级别,在电量低时,应该降低更新频率甚至停止更新。
注:此处的更新,指的是类似发送心跳包的动作,或者定时更新内容。并非仅仅指更新应用版本。如果是用户动作,比如翻页刷新,不需要根据电量和充电状态处理。
判断当前充电状态
通过判断当前充电状态开始。BatteryManager会通过一个intent广播所有电池和充电详情,包含充电状态。因为这是一个sticky intent,你不需要注册广播接收器。简单地通过调用 registerReceiver,像下面的代码段传入一个null的接收器,当前电池状态的intent就会返回。你也可以传入一个真实的接收器对象,但我们暂时不会操作更新,所以这是没必要的。
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter); //你可以读到充电状态,如果在充电,可以读到是usb还是交流电 // 是否在充电 int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; // 怎么充 int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
通常你应该在使用交流电充电时最大化后台更新频率,在使用usb充电时降低,不充电时更低。
监听充电状态的改变
充电状态很容易改变(插入/拔出充电器),所以监听充电状态,更改刷新频率很重要。充电状态改变时,BatteryManager会发一个广播。接收这些事件很重要,甚至在应用没有运行的时候,因为可能你需要后台开启更新服务。所以,在Androidmanifest.xml里注册广播接收器,加上两个action:ACTION_POWER_CONNECTED 和ACTION_POWER_DISCONNECTED作为过滤。
<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>
在关联的广播接收器实现里,你可以读出当前充电状态,方法跟上一步说的相同:
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 == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; } }
判断当前剩余电量
在某些案例里,判断当前剩余电量同样很有用。如果电量在某些水平之下,你可能会选择降低后台更新频率。你可以用下面的代码读到电量:
//当前剩余电量 int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); //电量最大值 int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); //电量百分比 float batteryPct = level / (float)scale;
监听剩余电量显著改变
持续监听电池状态不容易,但你不必这么做。一般来说,持续监听电池电量对电池的影响比app的正常行为还要大。所以,只监听剩余电量的指定级别的改变(进入或离开低电量状态)是一个很好的实践。
manifest里声明的接收器,会在进入或离开低电量状态时触发。
<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>
剩余电量严重不足时,最好禁用所有后台更新。在你可以使用手机之前就关机了,这种情况下,如果刷新数据并不重要。
在很多情况下,设备是是插入到底座里充电的(好吧,反正我没见几个人额外花钱买底座的,可能国外较多)。下节讲怎么判断当前底座状态和监听插入底座时改变。
参考:
http://www.android-doc.com/reference/android/os/BatteryManager.html
相关文章推荐
- Android学习小记----监听电量的变化(不能静态注册的广播), 保持Service不被杀死的好方法
- android 监听电池电量的变化
- Android学习小记----监听电量的变化(不能静态注册的广播)
- Android 电量变化监听
- 监听电量变化 Android 良讯
- Android学习小记----监听电量的变化(不能静态注册的广播)
- android 监听手机电量变化
- android 监听EditText 的变化
- Android中监听电池变化
- Android之使用Contentprovider对外共享数据和实现数据监听变化
- android 5.0 以上监听网络变化
- Android使用ContentObserver监听数据库变化
- Android开发入门之实现动态注册广播监听网络变化
- android 监听网络状态的变化及实战
- android 使用广播监听网络状态变化
- 深入分析Android监听网络变化的坑
- android 通过GPS获取用户地理位置并监听位置变化
- android 监听系统时区变化,日期变化,时间变化
- Android监听网络的变化
- 监听开机,电量变化,信号变化的广播