官方API解释:
Base class for code that will receive intents sent by sendBroadcast().
If you don't need to send broadcasts across applications, consider using this class with [LocalBroadcastManager]
instead of the more general facilities described below. This will give you a much more efficient implementation (no cross-process communication needed) and allow you to avoid thinking about any security issues related to other applications being able to receive or send your broadcasts.
详细信息参考API文档
一:为什么需要广播接收者
- [1]什么样的人听广播:司机 学生 老人等等
- [2]要听广播的条件:电台 收音机 广播节目频率
- [3]Android内部定义好了电台 已经定义好了一些广播事件 如 外拨电话 短信到来 SD卡状态 电池电量等等(相当于电台)
- [4]用Broadcareceiver去接收系统已经定义好的广播事件
二:广播接收者的使用步骤
外拨电话的广播
-
1,定义一个类继承Broadcareceiver,重写onReceive方法
-
2,在清单文件中注册广播,设置意图过滤器,添加动作
-
3,在onReceive方法中写业务逻辑
这里外拨电话需要添加用户权限
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
监听SD卡状态的广播
注意了:在监听SD卡状态的时候,必须配置一个data 约束类型为file,因为SD卡里面存放的是file文件
当SD卡状态改变时执行该方法
监听短信的到来的广播
1,设置短信到来的动作
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
2,设置监听短信到来的权限
<uses-permission android:name="android.permission.RECEIVE_SMS" />
3,用SmsMessage对象来监听短信的到来
监听安装或者卸载应用程序的广播
1,设置监听安装或者卸载程序的动作
注意了:这里需要设置一个data 约束类型为package 因为安装或者卸载的是包
<data android:scheme="package"/>
示例代码:
监听开机启动的广播
1,添加动作和设置用户权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
示例代码:
三:有序广播
1,有序广播类似于中央发文件 一级一级的向下发
2,有序广播的特点
有序广播可以被终止
有序广播的数据可以被修改
示例代码:
1,创建工程发送自定义的有序广播
发送自定义广播2,创建工程接收有序广播
2.1设置动作 注意了:这里的动作必须与发送有序广播的程序设置的动作保持一致
2.2设置接收有序广播的优先级
2.3可以修改有序广播的数据 并向下发送
3,然后可以有第2个 第三个广播接收者
注册第二、第三个接收者第二、三个接收者
4,注意了 :有序广播可以有最终的广播接收者 该广播接收者定义在发送有序广播的工程内,并不需要在清单文件中注册。此时需要修改发送 有序广播的方法中的一个参数(添加上最终的广播接收者)
最终的接收者
修改发送自定义广播方法的参数
四:无序广播
无序广播 就像新闻联播一样 每天晚上7点准时开播
特点:
1,无序广播不能被终止
2,无序广播的数据不能被修改
示例代码:
1,创建工程 发送无序广播
2,创建工程 接收无序广播
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="com.mmk.app"/>
</intent-filter>
</receiver>
五:动态注册的广播
特殊的广播事件
操作特别频繁的广播事件 如屏幕的解锁和锁屏 电池电量的变化等等 这类广播事件在清单文件中注册是无效的 需要在代码中动态注册
屏幕的锁屏和解锁,示例代码:
1,创建广播接收者
2,在MainActivity的onCreate方法中动态注册广播
3,注意了 动态注册广播的情况下,按下返回键的时候报错如下:也是就忘记了取消注册
08-16 02:30:58.207: E/ActivityThread(6784): Activity com.example.day07_08teshu.MainActivity has leaked IntentReceiver com.example.day07_08teshu.ScreenRecei@b64b40d8 that was originally registered here. Are you missing a call to unregisterReceiver()?
解决方案:在onDestroy方法中取消注册
网友评论