一.BroadcastReceiver
虽然自从 Rxjava 出来以后,Broadcast 已经用的很少了,但是 Broadcast 还是有自己的优势的,比如说接收系统广播。
1.注册广播
1 | public class MyReceiver extends BroadcastReceiver { |
注册广播有两种方式,一种是静态注册,就是在 AndroidManifest 中注册
1 | <receiver android:name=".business.Broadcast.MyReceiver"> |
还有一种是动态注册,通过动态注册的时候一定要及时的解除注册。采用unregisterReceiver方法。
1 | IntentFilter intentFilter = new IntentFilter(); |
注册完成之后就可以发送广播了。
1 | Intent intent =new Intent(); |
广播注册的内部实现
静态广播的注册是由 PMS(PackageManagerService)实现的。而动态的广播从上面代码可以看出是由registerReceiver方法开始的。而 ContextWrapper 把这一方法委托给 ContextImpl,调用的是 ContextImpl 的registerReceiver方法
在这个方法里使用跨进程的方式来调用ActivityManagerNative.getDefault().registerReceiver方法。
所以说注册广播的真正实现是在 AMS 当中的。这个地方就是稍微了解一下内部实现过程,源码不深究。
二.发送广播
####发送广播的类型
普通广播(Normal Broadcast)
系统广播(System Broadcast)
有序广播(Ordered Broadcast)
粘性广播(Sticky Broadcast)(现在已经不推荐使用)
App 应用内广播(Local Broadcast)
1. 普通广播(Normal Broadcast)
若被注册了的广播接收者中注册时 intentFilter 的 action 与上述匹配,则会接收此广播(即进行回调 onReceive())
2.有序广播(Ordered Broadcast)
有序广播和普通广播的区别就是可以通过优先级的不同,依次来接收广播,而且优先级高的 Receiver 可以拦截广播,那么优先级低的 Receiver 即使 action 匹配也不会接收到广播,优先级高的 Receiver 还可以添加信息,传到下一个 Recevier。
3.系统广播(System Broadcast)
这个就是接受系统级的广播,调用系统 API,比如说拦截短信广播,
只要申请相关的权限就可以了。
4.app 应用内广播(Local Broadcast)
应用内广播就是是常用的避免回调的做法。
广播的发送内部实现
其实发送和注册的实现很类似,通过 ContextWrapper 的sendBroadcast方法,还是交给 ContextImpl 中的 sendBroadcast方法去实现。ContextImpl 依然是想 AMS 发送一个异步请求来发送广播。


