Android面试-2 BroadcastReceiver

简介

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


阅读更多
个人分类: Android面试
所属专栏: Android面试
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Android面试-2 BroadcastReceiver

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭