Android的广播有哪几种类型?各有什么特点?
1、系统广播(System Broadcast):Android系统内置的广播,用于对外广播系统基本状态的变化。比如开机广播、锁屏广播、网络状态变化广播、电量变化广播、应用安装与卸载广播等。系统广播,用户只能接收,无法发送。
2、普通广播(Normal Broadcast):也称无序广播,是用户自行发送和接收的一种广播,可通过定义
Intent-Filter
指定广播的action
和data
。发送广播时使用sendBroadcast()
。3、有序广播(Ordered Broadcast):也是用户自定义发送和接收的一种广播,区别在于广播发出后,广播接收者按照优先级(priority)从高到低依次接收,并且优先级高的接收到广播后,可以对广播进行拦截和修改。如果两个广播接收者优先级相同,则动态注册的广播优先级要高于静态注册的广播接收者。发送广播时使用
sendOrderedBroadcast()
。4、粘性广播(Sticky Broadcast):与普通广播不同的是,粘性广播发送后,信息就一直保存在系统的容器内,需要时可直接通过IntentFilter匹配指定的Action获取,无需广播接收者。比如电池电量的广播就是粘性广播。发送粘性广播使用
sendStickyBroadcast()
注:粘性广播因安全问题,从Android 5.0(API 21)起被弃用。5、本地广播(Local Broadcast):Android的广播属于全局广播,可以跨APP通信,只要条件符合,当前APP发出的广播可以被其它APP接收到,也可以接收到其它APP发出的广播。因此存在一定的安全性问题和效率问题。当不存在跨APP通信的需求时,推荐使用Android的本地广播。本地广播有以下几个特性:
1) 本地广播仅限APP内发送和接收,更安全高效;
2) 本地广播接收者只能动态注册,不能静态注册。
2. 广播有哪两种注册方式?二者有什么区别?
注册广播有两种方式,一种是在代码中进行动态注册;一种是在清单文件在进行静态注册。
1、动态注册:只有在应用启动后才能接收广播,应该未启动或已关闭则不能接收到广播。这种方式比较节省资源,推荐。
2、静态注册:无论应用处于何种状态,均可以接收到广播。这种方式比较耗费资源,除非有需求,否则不推荐这种方式。
也因此,Android中有些广播是不支持静态注册的,比如锁定屏幕和解锁屏幕的广播,电量变化的广播,时间变化的广播,配置变化的广播。
- android.intent.action.SCREEN_ON
- android.intent.action.SCREEN_OFF
- android.intent.action.BATTERY_CHANGED
- android.intent.action.CONFIGURATION_CHANGED
- android.intent.action.TIME_TICK
3. 不同方式注册的广播,onReceiver()方法里的Context参数相同吗?
不相同。
- 静态注册的广播,返回的是
ReceiverRestrictedContext
;- 动态注册的广播返回的是注册时的Context,比如Activity。
- 本地广播返回的是
ApplicationContext
。
网友评论