Android的大量系统事件都会对外发送标准广播:

创建广播Action常量:

ACTION_TIME_CHANGED系统时间被改变

ACTION_DATE_CHANGED系统日期被改变

ACTION_TIMEZONE_CHANGED系统时区被改变

ACTION_BOOT_COMPLETED系统启动完成

ACTION_PACKAGE_ADDED系统添加包

ACTION_PACKAGE_CHANGED系统的包改变

ACTION_PACKAGE_REMOVED系统的包被删除

ACTION_PACKAGE_RESTARTED系统的包数据被重启

ACTION_PACKAGE_DATA_CLEARED系统的包数据被清空

ACTION_BATTERY_CHANGED电池电量改变

ACTION_BATTERY_LOW电池电量低

ACTION_POWER_CONNECTED系统连接电源

ACTION_POWER_DISCONNECTED系统与电源断开

ACTION_SHUTDOWN系统被关闭

1,开机自启动的Service

我们经常会有这样的应用场合,比如消息推送服务,需要实现开机启动的功能。

例如,监听用户来电,监听用户短信,拦截黑名单电话等
为了让Service随应系统启动自动执行,可以让BroadcastReceiver监听Action为ACTION_BOOT_COMPLETED常量的Intent,然后在BroadcastReceiver中启动特定的Service

LaunchReceiver.java

public class LaunchReceiver extends BroadcastReceiver {/** 开机自启动的Service:* 例如,监听用户来电,监听用户短信,拦截黑名单电话等* 为了让Service随应系统启动自动执行,可以让BroadcastReceiver监听Action为ACTION_BOOT_COMPLETED常量的Intent,然后在BroadcastReceiver中启动* 特定的Service* ** */@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubIntent intent_to_service=new Intent(context,LaunchService.class);context.startService(intent_to_service);//广播里启动特定的Service}}

LaunchService.java

public class LaunchService extends Service {@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}//Service被创建时回调该方法,可开发任意Service,监听用户来电,监听用户短信,拦截黑名单电话等等public void onCreate(){/*// 定义1秒执行一行输出new Timer().schedule(new TimerTask(){@Overridepublic void run(){System.out.println("-----"+ new Date() + "-----");}}, 0, 1000);*/Toast.makeText(this, "系统已开机", Toast.LENGTH_LONG).show();}
}
<!-- 定义一个Broadcastreceiver,监听系统开机广播 --><receiver android:name=".LaunchReceiver"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"></action><!-- 系统启动完成会发出此action的intent --></intent-filter></receiver><service android:name=".LaunchService"></service>
<!--访问系统开机事件的权限 --><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

2,短信提醒,系统接收到短信时,发送广播,在系统接收到短信之前,激发Broadcast

当系统收到短信时,系统会对外发出一个有序广播,该广播的Intent对应的Action为android.provider.Telephony.SMS_RECEIVED
因此只要在程序中开发一个对应的BroadcastReceiver即可监听到系统收到短信
SmsReceiver.java

package com.hust.smsreceiver;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;
/** 短信提醒:* 当系统收到短信时,系统会对外发出一个有序广播,该广播的Intent对应的Action为android.provider.Telephony.SMS_RECEIVED* 因此只要在程序中开发一个对应的BroadcastReceiver即可监听到系统收到短信* */
public class SmsReceiver extends BroadcastReceiver {//当系统接收到短信是被触发,就是在系统自带的短信接收程序之前被触发,相当于拦截短信@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stub//如果接收到短信if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){/*在系统短信接收程序之前会被启动,如果取消广播,那么短信广播将不会被传播到系统的短信接收程序,也就是系统本身将不会收到短信*///abortBroadcast();//取消广播,这行代码会让系统收不到短信StringBuilder sb=new StringBuilder();//短信数据捆绑在intent的Bundle中Bundle bundle=intent.getExtras();if(bundle!=null){//通过pdus可以获得接收到的所有短信消息Object[]  pdus=(Object[]) bundle.get("pdus");//构建短信对象数组SmsMessage[] messages=new SmsMessage[pdus.length];for(int i=0;i<=pdus.length;i++){//根据pdus,把每个pdus转换成短信对象SmsMessagemessages[i]=SmsMessage.createFromPdu((byte[])pdus[i]);}for(SmsMessage message:messages){sb.append("短信来源:");sb.append(message.getDisplayOriginatingAddress());//获取短信的源地址sb.append("\n----短信内容-----\n");sb.append(message.getDisplayMessageBody());//获取短信的内容}}Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();//toast消息提示}}}
<receiver android:name=".SmsReceiver"><intent-filter android:priority="800"><!-- 优先级为800,在系统短信接受程序之前被触发 --><action android:name="android.provider.Telephony.SMS_RECEIVED"/></intent-filter>

3,电量变化

如果我们阅读软件,可能是全屏阅读,这个时候用户就看不到剩余的电量,我们就可以为他们提供电量的信息。要想做到这一点,我们需要接收一条电量变化的广播,然后获取百分比信息,这听上去挺简单的

当手机电量发生改变是,系统会对外发送Intent的ActionACTION_BATTERY_CHANGED的常量的广播,
当手机电量过低时,会发送ACTION_BATTERY_LOW常量的广播

package com.hust.batteryreceiver;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 {
/*当手机电量发生改变是,系统会对外发送Intent的ActionACTION_BATTERY_CHANGED的常量的广播,* 当手机电量过低只,会发送ACTION_BATTERY_LOW常量的广播* * */@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubBundle bundle=intent.getExtras();int current=bundle.getInt("level");//key=level是当前电量int total=bundle.getInt("scale");//key=scale是总电量//当前电量小于总电量的15%if(current*1.0/total<0.15){Toast.makeText(context, "电池电量过低,请尽快充电!", Toast.LENGTH_LONG).show();}}}
<receiver android:name=".BatteryReceiver"><intent-filter><action android:name="android.intent.action.BATTERY_CHANGED"></action></intent-filter></receiver>

Android中接收系统广播消息相关推荐

  1. android app 短信接收,如何在Android中接收短信?

    我是 Android的新手,我正在使用android 2.1进行一些sms_receive的事情:当收到短信时,它将无法正常工作-当收到短信时我没有发生任何事情,我有强制关闭,帮助! androidm ...

  2. android 按键消息,在android中模拟键盘消息(shell命令的方法)

    已找到解决方案[code] use: sendevent command format: sendevent device type code value [command] [device] [ty ...

  3. android 增加一条广播,Android中BroadcastReceiver广播使用及注意点

    Android中的广播用途很广,是四大组件之一.在android中可以看到它的各种应用,从系统发出的广播,用户自定义的广播等. 这里详细记录下广播的分类以及使用方法. 广播,是由两方面组成一个流程:广 ...

  4. 说说在 Android 中如何接收系统广播

    Android 中内置了很多系统级别的广播,我们可以在应用程序中通过监听这些广播来得到各种系统的状态信息.比如手机开机完成后发出一条广播,电池的电量发生变化后发出一条广播,时间或时区发生改变发出一条广 ...

  5. android 无法接收广播_别告诉我你不认识Android中广播接收者(二)

    前面我们了解了什么是广播接收者与广播接收者的创建,这一次我们要接着继续去了解广播接收者的相关知识,这些知识包括广播接收者的注册.自定义广播与广播的类型. 当我们学习完广播接收者之后,该如何才能让它起到 ...

  6. Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息...

    先看简单示例:点击按钮,2s之后,TextView改变内容. package cn.lixyz.handlertest;import android.app.Activity; import andr ...

  7. 重温Android中的消息机制

    引入: 提到Android中的消息机制,大家应该都不陌生,我们在开发中不可避免的要和它打交道.从我们开发的角度来看,Handler是Android消息机制的上层接口.我们在平时的开发中只需要和Hand ...

  8. 简述在android中如何发送广播消息,Android Intent发送广播消息实例详解

    Android Intent发送广播消息 Intent的另一种用途是发送广播消息,应用程序和Android系统都可以使用Intent发送广播消息,广播消息的内容是可以与应用程序密切相关的数据信息,也可 ...

  9. android时间接收器,android – 在飞机模式关闭/打开后,广播接收器在onReceive()中接收的时间太长...

    我创建了一个简单的广播接收器,它工作得很好,除非我打开/关闭空中飞机模式,使用onReceive方法接收广播消息需要将近2分钟.另一件事是,如果我们启动应用程序然后如果我更改Air plane模式(开 ...

最新文章

  1. IOS_多线程_ASI_AFN_UIWebView
  2. 湖北大学829数据库原理与c语言程序设计,2017年湖北大学教育学院829数据库原理与C语言程序设计考研强化模拟题...
  3. 【Hibernate】Hibrenate POJO 类在序列化时遇到的问题
  4. ML:MLOps系列讲解之《MLOps Stack Canvas堆栈画布》解读
  5. mfc程序转化为qt_小峰的QT学习笔记
  6. 我们要的是社会主义!
  7. Android Bitmap史上最详细全解 | 原力计划
  8. python中的运算符重载_Python中的操作符重载
  9. python可以做什么工作-学了那么多年python到底可以找什么工作?
  10. python中out函数_cython函数输出与python函数outpu略有不同
  11. 【HTML——代码雨】(效果+代码)
  12. svn admin 详细介绍
  13. python qqbot实现qq聊天机器人_Python QQBot库的QQ聊天机器人
  14. 多边形最大内接圆的简单画法
  15. python 合并word并生成目录_使用Python制作WORD报告
  16. 搜索引擎学习之旅3 - 搜索引擎工作流程
  17. gcc O3和O0编译的输出浮点数不相同
  18. 如何将整数数组转换为Zig-Zag格式?
  19. 50个直击灵魂的问题_直击心灵的48个问题
  20. 【证明】对称矩阵特征方程k重根恰有k个线性无关的特征向量

热门文章

  1. hfs快速搭建HTTP文件服务器
  2. 练习1: Python基本语法元素 (第1周)
  3. 第十三届“华中杯”大学生数学建模挑战赛题目 B 题 技术问答社区重复问题识别
  4. buuoj-crypto 2
  5. 03_Introduction_to_AMBA_AXI
  6. [trustzone]-TZC400学习总结
  7. 【攻防世界017】re4-unvm-me
  8. (8)JMP FAR段间跳转
  9. while((ch=getchar())!=EOFch != '\n');消除非法输入
  10. 析构设置为虚函数的原因