一、Broadcast 介绍

简介

广播(Broadcast)是组件之间传递数据的一种机制,也是一种方式。

作用

  • 传递数据,传递信息;
  • 应用内或是应用之间传递数据,都可以使用广播。

使用场景

  • 同一app内部的同一组件内的消息通信(单个或多个线程之间),建议使用Handler;
  • 同一app内部的不同组件之间的消息通信(单个进程),推荐使用《Android各组件/控件间通信利器之EventBus》。;
  • 同一app具有多个进程的不同组件之间的消息通信,推荐使用广播;
  • 不同app之间的组件之间消息通信,推荐使用广播;
  • Android系统在特定情况下与App之间的消息通信,推荐使用广播。

 

二、广播的分类

按照发送的方式分类

  • 标准广播

是一种异步的方式来进行传播的,广播发出去之后,所有的广播接收者几乎是同一时间收到消息的。他们之间没有先后顺序可言,而且这种广播是没法被截断的。

  • 有序广播

是一种同步执行的广播,在广播发出去之后,同一时刻只有一个广播接收器可以收到消息。当广播中的逻辑执行完成后,广播才会继续传播。并且前面的广播接收器还可以截断(abortBroadcast())正在传递的广播,这样后面的广播接收器就无法收到广播消息了。

按照注册的方式分类

  • 动态注册广播

顾名思义,就是在代码中注册的。

  • 静态注册广播

动态注册要求程序必须在运行时才能进行,有一定的局限性,如果我们需要在程序还没启动的时候就可以接收到注册的广播,就需要静态注册了。主要是在AndroidManifest中进行注册。

按照定义的方式分类

  • 系统广播

Android系统中内置了多个系统广播,每个系统广播都具有特定的intent-filter,其中主要包括具体的action,系统广播发出后,将被相应的BroadcastReceiver接收。系统广播在系统内部当特定事件发生时,由系统自动发出。

  • 自定义广播

由应用程序开发者自己定义的广播

按照发送的范围分类

  • 全局广播

全局广播可以被其它任何应用程序接收到,并且我们也可以接受来自于其它任何应用程序的广播。

  • 本地广播

本地广播广播只能在应用程序内部进行传递,并且广播接受器也只能接受来自本应用程序发出的广播,这样更安全,更高效。

 

三、其他

不同注册方式onReceive(context, intent)中的context具体类型

  • 官方定义

Context: The Context in which the receiver is running.
Intent: The Intent being received.

  • 说明

BroadcastReceiver本身不是Context,其内部也不含有Context,但在onReceive(Context context, Intent intent)中有context参数。这个context随着receiver的注册方式的不同而不同:
静态注册:context为ReceiverRestrictedContext
动态注册:context为Activity的context
LocalBroadcastManager的动态注册:context为Application的context

ANR问题

超过10s 出现ANR
注意:不要在 onReceive()方法中添加过多的逻辑或者进行任何的耗时操作,因为在广播接收器中是不允许开启线程的,当onReceive()方法运行了较长时间而没有结束时,程序就会报错。因此广播接收器更多的是扮演一种打开程序其它组件的角色,比如创建一条状态栏通知,或者启动一个服务等。

3.1后,静态注册接受广播方式的改变

广播权限signature 

待定

 

参考链接:
https://www.jianshu.com/p/53e6abd8bfc7 https://www.jianshu.com/p/92ccb8ca2ea5