今天,简单讲讲如何监听手机电量的变化。

监听电量是不能静态注册的。

后来上网搜索,发现有五个不能静态注册的广播,这里记录一下,免得下次再后知后觉的发现并惊讶于自己的笨拙。

 不能静态注册的广播:

  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_OKAYACTION_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

当手机电量发生改变时,系统会对外发送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 { @Overridepublic 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 监听手机电量变化相关推荐

  1. Android监听手机网络变化

    Android监听手机网络变化 手机网络状态发生变化会发送广播,利用广播接收者,监听手机网络变化 效果图 注册广播接收者 <?xml version="1.0" encodi ...

  2. android 监听手机开机

    今天,简单讲讲  android 监听手机开机. 需求描述:有些时候,我们需要我们的程序在开机后能自动运行,在系统即将关闭时,能写入一些记录到指定的文件里. 一.开机广播监听: Android系统 ...

  3. Android监听手机短信

    Android监听手机短信的方法有两种,分别为: 1.接受系统的短信广播:当手机收到新消息时,会发送一条广播,通过该广播就可以获取短信内容: 2.监听短信数据库:利用观察者模式监听短信数据库,当短信数 ...

  4. Android监听手机返回键

    Android在做项目时,有时候点击返回按钮没反应(有冲突),那就需要我们监听返回键.重写onKeyDown()方法: // 监听手机返回键 @Override public boolean onKe ...

  5. Android 监听系统语言变化

    ** 监听系统语言变化 ** 监听系统语言变化 首先先创建一个MyApplication继承Application public class MyApplication extends Applica ...

  6. Android 监听手机GPS打开状态

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70854942 本文出自[赵彦军的博客] GPS_Presenter package ...

  7. Android监听电池电量

    第一步:创建一个广播接收者,继承自BroadcastReceiver private class BatteryLevelReceiver extends BroadcastReceiver{ @Or ...

  8. android 监听手机屏幕唤醒和睡眠广播

    最近做APP要做一个android 手机屏幕唤醒和睡眠的监听. 但发现下面问题: 我想获取调用屏幕打开时应用.在我 AndroidManifest.xml 已经指定:android.intent.ac ...

  9. Android 监听手机按下Home键

    系统本身有这个广播,只需要监听这个广播就可以了! private BroadcastReceiver mHomeKeyEventReceiver = new BroadcastReceiver() { ...

最新文章

  1. MySQL 条件查询 limit、in、between and、like等等
  2. 【NetApp】NetBoot的使用方法
  3. vue 的常用模块安指令(持续记录)
  4. 注意!这些行为均涉嫌科研不端!
  5. php怎样连接上数据库服务器,php怎样连接数据库
  6. 【MySQL】MySQL EXPLAIN用法和结果
  7. 关于“工作组管理员”
  8. [编织消息框架][消息处理模式]管道模式
  9. html前端论文参考文献,web前端论文参考文献
  10. idea分支切换注意事项
  11. 边云协同的优点_与云端握手 是时候谈谈边云协同这个边缘计算新风向了
  12. 四川bh百汇云商城运营中
  13. HTML+CSS绘制太阳系九大行星运行轨迹
  14. ie8 ajax拒绝访问的解决办法
  15. micropython中文社区 microbit_microbit如何烧录micropython固件
  16. 面向对象学习笔记1 - 人狗大战
  17. java 判断日期是否为今天
  18. CPGAVAS2|叶绿体注释工具
  19. 【c语言训练】尼科切斯定理的验证
  20. 传智专修学院推出颠覆式办学模式,专注实用技能型人才培养

热门文章

  1. Android动画原理
  2. 计算机基础知识:原码、反码、补码
  3. 谭浩强C语言程序设计 学习辅导练习题
  4. 最优子结构(Optimal Substructure)
  5. 网络基本功系列:细说网络那些事儿
  6. viewpager+fragment学习笔记
  7. 设定自动获得DNS服务器地址
  8. 在Linux中创建静态库和动态库 (转)
  9. DDD:关于聚合的思考
  10. 点击关闭按钮时缩小到系统任务栏