一 广播按照类型分为两种,一种是全局广播,另外一种是本地广播

全局广播的意思就是发出的广播可以被其他任意的应用程序接收,或者可以接收来自其他任意应用程序的广播。

本地广播则是只能在应用程序的内部进行传递的广播,广播接收器也只能接收内部的广播,不能接受其他应用程序的广播

之前所说是属于全局广播,存在有数据安全的问题,使用本地广播,只能在本地应用程序中发送与接收广播,可以起到保护数据安全的作用。

回想一下,之前动态注册广播是通过registerReceiver(receiver,intentFilter)这个方法来注册的,其实,本地广播的使用与其十分类似,之前的步骤均是一样的,就是在后面注册调用的方法不同而已,注册时候调用的是LocalBroadcastManager的registerReceiver方法,之前调用的是context的registerReceiver方法,两者参数就是相同的

 

按照广播机制也可以分为两种,标准广播和有序广播

BroadcastReceiver所对应的广播分两类:普通广播和有序广播。

普通广播:通过Context.sendBroadcast()方法来发送,它是完全异步的,所有的接收者都会接收事件,不可以被拦截,不可以被修改。。

所有的receivers(接收器)的执行顺序不确定,因此所有的receivers(接收器)接收broadcast的顺序不确定。

这种方式效率更高,但是BroadcastReceiver无法使用setResult系列、getResult系列及abort(中止)系列API

有序广播:是通过Context.sendOrderedBroadcast来发送,所有的receiver依次执行,按照优先级,一级一级的向下传递,接收者可以修改广播数据,也可以终止广播事件。

BroadcastReceiver可以使用setResult系列函数来结果传给下一个BroadcastReceiver,通过getResult系列函数来取得上个BroadcastReceiver返回的结果,并可以abort系列函数来让系统丢弃该广播,使用该广播不再传送到别的BroadcastReceiver。

可以通过在intent-filter中设置android:priority属性来设置receiver的优先级,优先级相同的receiver其执行顺序不确定。

如果BroadcastReceiver是代码中注册的话,且其intent-filter拥有相同android:priority属性的话,先注册的将先收到广播。

广播优先级

如果使用的是动态注册,直接调用intentFilter.setPriority();

如果是静态注册,则是设置intent-fliter的中Priority属性

android全局音效 android 全局广播_android全局音效

优先度的大小设置范围为-1000~1000

 想要截断广播,只需要在onreceive()方法中调用aboryBroadcast()即可是广播不再传递下去

 

二.进行广播注册

注册的方式有两种,一种是动态注册(使用java代码)

      动态注册的步骤:

  1. 在相关的activity文件中new一个刚才我们定义的广播类
  2. 调用context.registerReceiver方法进行注册,方法的第一个参数为广播类,第二个则是intentFilter类
  3. 动态注册的广播接收器一定要注销,在onDestroy方法中调用unregisterReceiver(recevier)

    静态注册的步骤:

  1. 在AndroidMainFest中的application标签下加上receiver的子标签
  2. 与通过name属性指定注册一个广播类,也就是我们刚才定义的那个广播类,还有enabled与exported属性,enabled代表是否启用这个广播接收器,exported属性表示是否允许这个广播接收器接受本程序以外的广播
  3. 之后在receiver标签下加上intent-filter标签,设置其的action

android全局音效 android 全局广播_优先级_02