一、BroadcastReceiver 简介
在 Android 中,Broadcast 是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver 是对发送出来的 Broadcast 进行过滤接受并响应的一类组件。
广播接收者(BroadcastReceiver)用于接收广播 Intent 的, 广播 Intent 的发送是通过调用 sendBroadcast/sendOrderedBroadcast 来实现的。通常一个广播 Intent 可以被订阅了此 Intent 的多个广播接收者所接收。
1.1 实现一个 BroadcastReceiver
需求:定义一个广播接收器,用于接收 SDCard 移除时发送的广播
1)创建一个新的 Android 工程 《广播接收器》。
2) 在 src 目录下新建一个 SDCardUnmountedReceiver 类继承 BroadcastReceiver类,覆写 onReceive 方法,代码清单如下:
3)注册 SDCardUnmountedReceiver(两种方式)。
静态注册:在 AndroidManifest.xml 中注册广播。例:
动态注册:在JAVA代码中注册。例:
Tips:★ java 代码注册的广播接收者优先级要比清单文件的要高, 但是当前的广播接收者的生命周期的期限和activity是相关联的,activity销毁, 广播接收者也就不再起作用。
★ 通过清单文件注册的广播接收者在系统中运行一次后就会被注册到系统中,以后无需运行此广播接受者,但是也可以接收到广播。
★ 接收广播时要注意在清单文件中添加对应的权限。
二、Android 中常见广播
例一、监听拨打电话广播
需求:监听用户拨打电话,在用户拨打电话号码前自动加上 17951 等
1)新创建一个 Android 工程
2)在 src 目录下新创建一个类 IPCallerReceiver 继承 BroadcastReceiver,重写OnReceive 方法
3)在 AndroidManifest.xml 中注册广播接收者。在下面的配置文件中可以设定优先级priority=1000,优先级越高越优先接收到广播;
4)运行项目,拨打电话。
例二、监听系统开机的广播
需求:拦截手机开机的广播,手机开机后,弹一个提示
虚拟机重启命令:adb shell reboot
Tips:3.0 以上版本必须加权限, 以下的版本可以不加,3.0 以上的版本如果用户没有启动过程序, 接收不到开启启动完成的广播
1)新创建一个 Android 工程
2)在 src 目录下新创建一个类 BootReceiver继承 BroadcastReceiver,重写OnReceive 方法
3)在 AndroidManifest.xml 中注册广播接收者。在下面的配置文件中可以设定优先级priority=1000,优先级越高越优先接收到广播;
4)运行项目,拨打电话。
诸如此类的广播还有 : 卸载与安装程序的广播、短信拦截等。
三、发送自定义广播
1)无序广播
1. 被拦截会报错;
2. 所有接收无序广播的广播接收者在此广播被发送时均能接收到此广播;
3.无序广播使用 sendBroadcast 方法来发送。
2)有序广播
1.有序广播可以被拦截,且优先级高的接收者可以拦截优先级低的广播;
2.接收者的优先级的取值范围是: 1000(最高) ~ -1000(最低);
3.相同优先级下,接收的顺序要看在清单文件中声明的顺序,先声明的接收者比后声明的要先收到广播无序广播;
4.使用 sendOrderedBroadcast 方法来发送,使用 abortBroadcast 方法拦截;
5.广播接收者的优先级在清单文件中声明接收者时, 在标签下通过设置”android:property”属性来设置