一 广播按照类型分为两种,一种是全局广播,另外一种是本地广播
全局广播的意思就是发出的广播可以被其他任意的应用程序接收,或者可以接收来自其他任意应用程序的广播。
本地广播则是只能在应用程序的内部进行传递的广播,广播接收器也只能接收内部的广播,不能接受其他应用程序的广播
之前所说是属于全局广播,存在有数据安全的问题,使用本地广播,只能在本地应用程序中发送与接收广播,可以起到保护数据安全的作用。
回想一下,之前动态注册广播是通过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属性
优先度的大小设置范围为-1000~1000
想要截断广播,只需要在onreceive()方法中调用aboryBroadcast()即可是广播不再传递下去
二.进行广播注册
注册的方式有两种,一种是动态注册(使用java代码)
动态注册的步骤:
- 在相关的activity文件中new一个刚才我们定义的广播类
- 调用context.registerReceiver方法进行注册,方法的第一个参数为广播类,第二个则是intentFilter类
- 动态注册的广播接收器一定要注销,在onDestroy方法中调用unregisterReceiver(recevier)
静态注册的步骤:
- 在AndroidMainFest中的application标签下加上receiver的子标签
- 与通过name属性指定注册一个广播类,也就是我们刚才定义的那个广播类,还有enabled与exported属性,enabled代表是否启用这个广播接收器,exported属性表示是否允许这个广播接收器接受本程序以外的广播
- 之后在receiver标签下加上intent-filter标签,设置其的action