android 监听手机电量变化
2017-09-14 08:32
417 查看
今天,简单讲讲如何监听手机电量的变化。
监听电量是不能静态注册的。
后来上网搜索,发现有五个不能静态注册的广播,这里记录一下,免得下次再后知后觉的发现并惊讶于自己的笨拙。
不能静态注册的广播:
android.intent.action.SCREEN_ON
android.intent.action.SCREEN_OFF
android.intent.action.BATTERY_CHANGED
android.intent.action.CONFIGURATION_CHANGED
android.intent.action.TIME_TICK
原因(有以下几种说法,提供给大家参考):
1.提高系统效率:这两个事件是android的基本事件,如果大多数程序监听,会大大的拖慢整个系统,所以android不鼓励我们在后台监听这两个事件。
2.因为有序广播的优先级问题。以上这些广播中,静态注册时,系统的优先级大于应用,并且系统阻止了广播的向下传播。又因在Android 的广播机制中,动态注册的优先级是要高于静态注册优先级的。故用动态注册代替静态注册。
3.系统安全问题。
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:表示当前电池已经从电量低恢复为正常。
当手机电量发生改变时,系统会对外发送Intent的Action为android.intent.action.BATTERY_CHANGED常量的广播;当手机电量过低时,系统会对外发送Intent的Action为android.intent.action.BATTERY_LOW常量的广播。
当手机电池从电量不足状态恢复时,系统会对外发送Intent的Action为android.intent.action.BATTERY_OKAY常量的广播。
下面通过一个简单实例来演示:
Receiver:
配置Receiver:
在清单文件添加权限
这里可能需要注意一下, <action android:name="android.intent.action.BATTERY_CHANGED" /> 静态注册可能没有效果,版本较低的可能才有效果,版本叫高的只能动态注册。
android 监听手机电量变化就讲完了。
就这么简单。
监听电量是不能静态注册的。
后来上网搜索,发现有五个不能静态注册的广播,这里记录一下,免得下次再后知后觉的发现并惊讶于自己的笨拙。
不能静态注册的广播:
android.intent.action.SCREEN_ON
android.intent.action.SCREEN_OFF
android.intent.action.BATTERY_CHANGED
android.intent.action.CONFIGURATION_CHANGED
android.intent.action.TIME_TICK
原因(有以下几种说法,提供给大家参考):
1.提高系统效率:这两个事件是android的基本事件,如果大多数程序监听,会大大的拖慢整个系统,所以android不鼓励我们在后台监听这两个事件。
2.因为有序广播的优先级问题。以上这些广播中,静态注册时,系统的优先级大于应用,并且系统阻止了广播的向下传播。又因在Android 的广播机制中,动态注册的优先级是要高于静态注册优先级的。故用动态注册代替静态注册。
3.系统安全问题。
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:表示当前电池已经从电量低恢复为正常。
当手机电量发生改变时,系统会对外发送Intent的Action为android.intent.action.BATTERY_CHANGED常量的广播;当手机电量过低时,系统会对外发送Intent的Action为android.intent.action.BATTERY_LOW常量的广播。
当手机电池从电量不足状态恢复时,系统会对外发送Intent的Action为android.intent.action.BATTERY_OKAY常量的广播。
下面通过一个简单实例来演示:
Receiver:
package com.home.receiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.widget.Toast; public class BatteryReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_BATTERY_OKAY.equals(intent.getAction())) { Toast.makeText(context, "电量已恢复,可以使用!", Toast.LENGTH_LONG).show(); } if (Intent.ACTION_BATTERY_LOW.equals(intent.getAction())) { Toast.makeText(context, "电量过低,请尽快充电!", Toast.LENGTH_LONG).show(); } if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) { Bundle bundle = intent.getExtras(); // 获取当前电量 int current = bundle.getInt("level"); // 获取总电量 int total = bundle.getInt("scale"); StringBuffer sb = new StringBuffer(); sb.append("当前电量为:" + current * 100 / total + "%" + " "); // 如果当前电量小于总电量的15% if (current * 1.0 / total < 0.15) { sb.append("电量过低,请尽快充电!"); } else { sb.append("电量足够,请放心使用!"); } Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show(); } } }
配置Receiver:
receiver android:name="com.home.receiver.BatteryReceiver"> <intent-filter> <action android:name="android.intent.action.BATTERY_CHANGED" /> <action android:name="android.intent.action.BATTERY_OKAY"/> <action android:name="android.intent.action.BATTERY_LOW"/> </intent-filter> </receiver>
在清单文件添加权限
<uses-permission android:name="android.permission.BATTERY_STATS"/>
这里可能需要注意一下, <action android:name="android.intent.action.BATTERY_CHANGED" /> 静态注册可能没有效果,版本较低的可能才有效果,版本叫高的只能动态注册。
android 监听手机电量变化就讲完了。
就这么简单。
相关文章推荐
- Android之BroadcastReceiver监听手机电量
- android 监听电池电量的变化
- 接收系统广播消息之监听手机电量变化
- Android四大组件之--BroadcastReceiver,监测手机电量变化
- Android 电量变化监听
- Android广播监听手机电量
- Android监听手机网络变化
- 监听电量变化 Android 良讯
- Android监听手机网络变化
- Android 监听短信内容变化,并发送到自己的手机
- Android学习小记----监听电量的变化(不能静态注册的广播), 保持Service不被杀死的好方法
- Android手机联系人变化监听
- Android初级教程使用服务注册广播接收者监听手机解锁屏变化
- Android学习小记----监听电量的变化(不能静态注册的广播)
- Android 电量变化监听
- Android初级教程使用服务注册广播接收者监听手机解锁屏变化
- Android学习小记----监听电量的变化(不能静态注册的广播)
- android--解决方案--用BroadcastReceiver监听手机网络状态变化
- Android手机屏幕变化监听
- 【android】解决方案--用BroadcastReceiver监听手机网络状态变化