Android基础知识点(3)--Broadcast

一、信息

整理: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 的理解

  1. BroadcastReceiver 是 Android 四大组件之一,分为广播发送者、广播接收者。
  2. 主要作用监听 / 接收 应用 App 发出的广播消息,并做出响应,例如电话监听、网络监听等。
  3. 广播使用了设计模式中的观察者模式:基于消息的发布 / 订阅事件模型
  4. 原理:
  5. 继承 BroadcastReceiver,重写 onReceive()方法。
  6. 通过 Binder 机制向 ActivityManagerService 注册广播。
  7. 通过 Binder 机制向 ActivityMangerService 发送广播
  8. ActivityManagerService 查找符合相应条件的广播(IntentFilter/Permission)的BroadcastReceiver,将广播发送到 BroadcastReceiver 所在的消息队列中。
  9. BroadcastReceiver 所在消息队列拿到此广播后,回调它的 onReceive()方法。

参考阅读:

Android四大组件:BroadcastReceiver史上最全面解析

扫描二维码关注公众号,回复: 8727253 查看本文章

3、广播的类型

  1. 普通广播:开发者自定义 intent 广播。
  2. 系统广播:系统内置广播,如开机、网络状态变化。
  3. 有序广播:发送出去的广播被广播接收者按照先后顺序接收,先接收道广播接受者可对广播进行修改或者截断,使用 sendOrderedBroadcast(intent)。
  4. 粘性广播:由于在 Android5.0 & API 21 中已经失效,所以不建议使用,在这里也不作过多的总结。
  5. App 应用内广播:App 应用内广播可理解为一种局部广播,广播的发送者和接收者都同属于一个 App,(将 exported 属性设置为 false)

4、广播两种注册方式区别

  1. 静态注册
    1. 使用。
    2. 常驻广播。
    3. 不受组件的生命周期影响,应用关闭后,依旧能接收到广播。
    4. 耗电、占用内存。
  2. 动态注册
    1. 使用 Context.registerReceiver()注册,使用Context.unregisterReceiver(mBroadcastReceiver);
    2. 非常驻广播。
    3. 跟随组件生命周期变化。

5、本地广播和全局广播有什么差别?

同 6

6、BroadcastReceiver,LocalBroadcastManager 区别

  1. 应用场景
  2. BroadcastReceiver 用于应用之间的传递消息。
    2. LocalBroadcastManager 用于应用内部传递消息,比 BroadcastReceiver 更加高效。
  3. 安全
  4. BroadcastReceiver 本质上它是跨应用的,所以在使用它时必须要考虑到不要被别的应用滥用。
  5. LocalBroadcastManager 不需要考虑安全问题,因为它只在应用内部有效。
  6. 原理
    1. BroadcastReceiver 是以 Binder 通讯方式为底层实现。
    2. LocalBroadcastManager 的核心实现是 Handler,只是利用到了 IntentFilter 的 match 功能,至于 BroadcastReceiver 换成其他接口也无所谓,顺便利用了现成的类和概念而已,安全性更好,效率更高。

7、程序A能否接收到程序B的广播

能,使用全局广播 BroadCastRecevier 能进行跨进程通信。

8、如何通过广播拦截和 abort 一条短信

  1. 首先添加接收短信的权限
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
  1. 在清单文件中注册广播接收器,设置该广播接收器优先级,尽量设高一点。
  2. 创建一个 BroadcastReceiver 来实现广播的处理,并设置拦截器 abortBroadcast()。

11、广播是否可以请求网络

不可以,广播默认在主线程中。

12、广播引起 anr 的时间限制是多少

10 s

13、广播传输的数据是否有限制,是多少,为什么要限制

  1. 你用 Intent 传递数据,实际上走的是跨进程通信(IPC),跨进程通信需要把数据从内核 copy 到进程中,每一个进程有一个接收内核数据的缓冲区**,**默认是 1 M。如果一次传递的数据超过限制,就会出现异常。
  2. 不同厂商表现不一样有可能是厂商修改了此限制的大小,也可能同样的对象在不同的机器上大小不一样。
  3. 传递大数据,不应该用 Intent;考虑使用 ContentProvider 或者直接匿名共享内存。简单情况下可以考虑分段传输。

14、广播注册一般有几种,各有什么优缺点

  1. 静态注册
    1. 常驻,当应用程序关闭后如果有信息广播来,程序也会被系统调用,自己运行。
    2. 无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器就是打开着的。
  2. 动态注册
    1. 不常驻,广播会跟随程序的生命周期。
    2. 在 Android 的广播机制中,动态注册优先级高于静态注册优先级,因此在必要情况下,是需要动态注册广播接收者的。
    3. 当用来注册的 Activity 关掉后,广播也就失效了。
发布了12 篇原创文章 · 获赞 11 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_44947117/article/details/104038080