简介
BroadcastReceiver是消息型组件,采用了观察者模式,用于不同组件甚至不同应用传递消息,四大组件中,只有BroadcastReceiver既可以在AndroidManifest也可以在java代码中注册,其他的都必须在AndroidManifest中注册。
基本操作
定义广播接受者
继承BroadCastReceiver重写onReceive
注册广播
- 静态广播:在AndroidManifest注册,应用安装时会被系统解析,不需要启动应用也能接受广播
- 动态广播:通过在java中Context.registerReceiver注册,通过Context.unRegisterReceiver解注册
发送广播
通过context.send系列方法,发送后,AMS会通过intent-filter进行匹配接收者。发送的广播类型有普通,有序,粘性。注意android5之后广播不会发送给已经停止的应用,若需要调起未启动应用则需要给广播的intent添加两个额外标志位。
内部实现机制
三个角色:消息发送者(Context.sendXXX),消息处理中心(AMS),消息接收者(BroadcastReceiver)
1)自定义广播接受者BroadcastReceiver,并覆写onRecvice()方法;
2) 广播接收者通过Binder机制向AMS(Activity Manager Service)进行注册;3)广播发送者通过Binder机制向AMS发送广播;
4)AMS查找符合相应条件(IntentFilter|permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中
5)消息循环执行拿到此广播,回调BroadcastReceiver中的Receiver()方法.
广播类型
普通广播(Normal Broadcast
):开发者自定义的广播,当IntentFilter匹配并且发送广播具有相关权限则可以接收到
系统广播(System Broadcast
):系统自动发出广播(信号变化等),我们只需注册接收者时只需定义相关ACTION
粘性广播(Sticky Broadcast
):发送时用sendOrderBroadcast,接收者按照优先级依次接收,先者可以拦截和修改广播
App应用内广播(Local Broadcast
):因为Android中的广播可以跨App直接通信(exported对于有intent-filter情况下默认值为true),所以可能导致安全性和效率性问题。App应用内广播是局部广播,广播的发送者和接收者都同属于一个App。有两种使用方式:一,注册广播的exported设置false,广播发送接收增加permission,发送广播指定包名(intent.setPackage)。二。使用封装好的LocalBroadcastManager类。使用方式上与全局广播几乎相同,只是注册/取消注册广播接收器和发送广播时将参数的context变成了LocalBroadcastManager的单一实例。
参考
https://www.jianshu.com/p/ca3d87a4cdf3