一、信息
整理:yoyiyi(soleil雪寂)
创建时间:2019 年 6 月 25 日
修改时间:2019 年 1 月 19 日
校对:yoyiyi(soleil雪寂)
状态:更新中
字数:1616 字
仓库:Soleil-Notes
二、目录
1、BrocastReceiver 里可不可以执行耗时操作
2、请描述一下广播 BroadcastReceiver 的理解
3、广播的类型
4、广播两种注册方式区别
4、本地广播和全局广播有什么差别
5、BroadcastReceiver,LocalBroadcastReceiver 区别
6、程序 A 能否接收到程序 B 的广播
7、如何通过广播拦截和 abort 一条短信
8、广播是否可以请求网络
9、广播引起 anr 的时间限制是多少
10、广播传输的数据是否有限制,是多少,为什么要限制
11、广播注册一般有几种,各有什么优缺点
三、正文
1、BrocastReceiver 里可不可以执行耗时操作
不能,当 onReceive()方法在 10 s 内没有执行完毕,Android 会认为该程序无响应,所以在BroadcastReceiver 里不能做一些比较耗时的操作,否侧会弹出 ANR 的对话框。
2、请描述一下广播 BroadcastReceiver 的理解
- BroadcastReceiver 是 Android 四大组件之一,分为广播发送者、广播接收者。
- 主要作用监听 / 接收 应用 App 发出的广播消息,并做出响应,例如电话监听、网络监听等。
- 广播使用了设计模式中的观察者模式:基于消息的发布 / 订阅事件模型
- 原理:
- 继承 BroadcastReceiver,重写 onReceive()方法。
- 通过 Binder 机制向 ActivityManagerService 注册广播。
- 通过 Binder 机制向 ActivityMangerService 发送广播
- ActivityManagerService 查找符合相应条件的广播(IntentFilter/Permission)的BroadcastReceiver,将广播发送到 BroadcastReceiver 所在的消息队列中。
- BroadcastReceiver 所在消息队列拿到此广播后,回调它的 onReceive()方法。
参考阅读:
Android四大组件:BroadcastReceiver史上最全面解析
扫描二维码关注公众号,回复:
8727253 查看本文章
3、广播的类型
- 普通广播:开发者自定义 intent 广播。
- 系统广播:系统内置广播,如开机、网络状态变化。
- 有序广播:发送出去的广播被广播接收者按照先后顺序接收,先接收道广播接受者可对广播进行修改或者截断,使用 sendOrderedBroadcast(intent)。
- 粘性广播:由于在 Android5.0 & API 21 中已经失效,所以不建议使用,在这里也不作过多的总结。
- App 应用内广播:App 应用内广播可理解为一种局部广播,广播的发送者和接收者都同属于一个 App,(将 exported 属性设置为 false)
4、广播两种注册方式区别
- 静态注册
- 使用。
- 常驻广播。
- 不受组件的生命周期影响,应用关闭后,依旧能接收到广播。
- 耗电、占用内存。
- 动态注册
- 使用 Context.registerReceiver()注册,使用Context.unregisterReceiver(mBroadcastReceiver);
- 非常驻广播。
- 跟随组件生命周期变化。
5、本地广播和全局广播有什么差别?
同 6
6、BroadcastReceiver,LocalBroadcastManager 区别
- 应用场景
- BroadcastReceiver 用于应用之间的传递消息。
2. LocalBroadcastManager 用于应用内部传递消息,比 BroadcastReceiver 更加高效。- 安全
- BroadcastReceiver 本质上它是跨应用的,所以在使用它时必须要考虑到不要被别的应用滥用。
- LocalBroadcastManager 不需要考虑安全问题,因为它只在应用内部有效。
- 原理
- BroadcastReceiver 是以 Binder 通讯方式为底层实现。
- LocalBroadcastManager 的核心实现是 Handler,只是利用到了 IntentFilter 的 match 功能,至于 BroadcastReceiver 换成其他接口也无所谓,顺便利用了现成的类和概念而已,安全性更好,效率更高。
7、程序A能否接收到程序B的广播
能,使用全局广播 BroadCastRecevier 能进行跨进程通信。
8、如何通过广播拦截和 abort 一条短信
- 首先添加接收短信的权限
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
- 在清单文件中注册广播接收器,设置该广播接收器优先级,尽量设高一点。
- 创建一个 BroadcastReceiver 来实现广播的处理,并设置拦截器 abortBroadcast()。
11、广播是否可以请求网络
不可以,广播默认在主线程中。
12、广播引起 anr 的时间限制是多少
10 s
13、广播传输的数据是否有限制,是多少,为什么要限制
- 你用 Intent 传递数据,实际上走的是跨进程通信(IPC),跨进程通信需要把数据从内核 copy 到进程中,每一个进程有一个接收内核数据的缓冲区**,**默认是 1 M。如果一次传递的数据超过限制,就会出现异常。
- 不同厂商表现不一样有可能是厂商修改了此限制的大小,也可能同样的对象在不同的机器上大小不一样。
- 传递大数据,不应该用 Intent;考虑使用 ContentProvider 或者直接匿名共享内存。简单情况下可以考虑分段传输。
14、广播注册一般有几种,各有什么优缺点
- 静态注册
- 常驻,当应用程序关闭后如果有信息广播来,程序也会被系统调用,自己运行。
- 无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器就是打开着的。
- 动态注册
- 不常驻,广播会跟随程序的生命周期。
- 在 Android 的广播机制中,动态注册优先级高于静态注册优先级,因此在必要情况下,是需要动态注册广播接收者的。
- 当用来注册的 Activity 关掉后,广播也就失效了。