(Android基础)什么是BroadcastReceive

##概述

广播是Android的四大组件之一,它本质是一种全局的监听器,是一种消息订阅/发布机制,可以监听用户发出的广播,也能够监听系统级广播消息,并拥有自己的进程.

广播主要分为两部分,一:广播的注册与发送.二:广播的接收

###广播的注册与发送

广播的注册根据其注册形式不同主要分为两种,

一种是静态注册,通过在清单文件(AndroidManifeast),声明已经实现的Receive类并注明监听的action,这种静态注册的方法,会在应用第一次启动后接受者添加到系统中去,下次当有需要接受的广播发出时即使应用进程还未启动也能唤醒对应进程来处理广播消息

另一种是动态注册,通过广播接受者的实例和填充好接受条件的Intent,调用Context的registerReceiver()从而实现注册

广播的发送根据其发送的广播的类型分为三种
发送普通广播 ,发送有序广播,发送粘性广播

  • 普通广播发送之后,在BroadcastQueue中的接受者将被遍历接受(while),理论上为几乎同时接受
  • 有序广播发送之后,在BroadcastQueue中根据优先级排序好的接受者将依次接受到广播
  • 粘性广播发送之后,将被保存在AMS中,当有新的接受者注册后将接受到之前发送的广播

(tips:有序广播有先后顺序可以被拦截,粘性广播可以被移除)

###广播的接收

在广播注册之后当有对应的广播需要被接收时,BroadcastReceiver的onReceive将被调用
onReceive默认在进程的主线程执行,所以不能在里面执行耗时操作

###广播的注册(Framework版)

静态广播的注册在应用被安装后,系统启动通过PMS解析已安装的应用列表,解析应用的清单文件获得在清单文件注册的广播接受者
动态注册调用Context中的registerReceiver,根据注册的BroadcastReceiver生成对应的ReceiverDispatcher,里面包含一个IBinder实现类的引用
然后传递给AMS的方法registerReceiver并将其入队到BroadcastQueue中去

广播的发送与接收

广播的发送传入接收的Intent.并传递给AMS的broadcastIntentLocked,根据广播的发送类型,将已有的广播接受者添加到对应的集合中去,无序广播一次性分发完成,有序广播依次分发
在分发的时候调用对应应用程序的ApplicationThread的scheduleRegisteredReceiver然后调用之前传入的IBinder实现类的引用的performReceiver然后对应广播接受者被创建出来并
调用其onReceive方法

为什么说onReceiver在对应进程的主线程执行呢?

因为在IBinder实现类里通过ActivityThread的Handler将线程从Binder的线程池切换回主线程
如果需要onReceiver在其他线程中运行可以通过register的重载方法传入对应线程的
Handler registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)

您的一份奖励,就是我的一份激励