您的位置:首页 > 移动开发 > Android开发

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 
BatteryManager
 for
documentation on the contents of the Intent.

你不能像组件那样在manifests里声明一个receive ,你只能通过Context.registerReceiver()注册。.
See 
ACTION_BATTERY_LOW
,
ACTION_BATTERY_OKAY
ACTION_POWER_CONNECTED
,
and 
ACTION_POWER_DISCONNECTED
 for 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 监听手机电量变化就讲完了。

就这么简单。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息