Android | 广播( Broadcast )
一、广播
I、系统广播
由 Android 系统进行发送,通常表示系统级事件发生。 系统广播由 Intent 意图对象进行封装。该 Intent 对象中的 action 字段包含了表示事件的详细信息字符串签名。
II、自定义广播
由 App 自身进行发送。为了通知其他 App 或本 App中的其他组件某一事件已经发生。对这类事件感兴趣的 App 或组件可以及注册该自定义广播的广播接收器。
1、标准广播 (Normal Broadcast)
2、有序广播 (Ordered Broadcast)
3、本地广播 (Local Broadcast)
二、广播接收器 ( Broadcast Receiver )
注册系统或 App 的广播事件。当事件发生时,注册了该事件的广播接收器被系统通过Intent 对象激活。
使用广播接收器的步骤包括:
1 子类化 BroadcastReceiver并实现onReceive()方法;
2 通过静态或动态方式注册广播接收器
3 注销广播接收器
1、子类化 BroadcastReceiver
当广播事件的 Intent 对象与该子类注册时的 intent filter匹配时,该广播接收器子类将接收 Intent 对象,并通过onReceive()方法响应广播事件。
当 App 收到一个已注册的广播 Intent 对象时, BroadcastReceiver类中的onReceive()方法被回调。onReceive()方法默认主线程中执行,除非在注册时显式的指定该方法在其他线程执行。onReceive()方法中的代码执行时间若超过 10 秒,Android 系统将判定广播接收器被阻塞,此时系统将可能向用户提示 ANR (application not responding) 错误。
2、注册广播接收器
静态注册,通过 Android 配置清单文件注册广播接收器;
动态注册,使用 Context 上下文类注册广播接收器;
(1)静态注册
在AndroidManifest.xml中声明 <receiver> 标签
android:name ,广播接收器子类的完整类名,如果该子类与配置清单文件指定的报名相同则可使用简写形式,如.AlarmReceiver;
android:exported,该值被设为 false 时,其他 App 不可向该广播接收器发送广播;
<intent−filter>,包含嵌套的标签用于指定该广播接收器监听的广播 Intent 对象的动作 (actions)
对于 Android 8.0 (API level 26) 以上版本,静态注册形式注册的隐式广播 (implicit broadcasts) 的行为是无效 的。
部分隐式广播 (ACTION_BOOT_COMPLETED、ACTION_TIMEZONE_CHANGED) 仍可通过静态注册形 式进行注册。
(2)动态注册/上下文注册(context-registered)
通过 应用上下文 (Application Context) 或 活动上下文 (Activity Context) 对广播进行动态注册
应用上下文 - 在应用运行时 (前台运行及后台运行),广播接收器均能接收到注册的广播事件;
活动上下文 - 在活动被销毁前 (onDestroy回调方法执行前),广播接收器均能接收到注册的广播事件。
步骤:
- 创建 IntentFilter 对象,并添加需要注册的广播Intent动作 (可以添加多个Intent动作)
- 通过上下文对象的 registerReceiver ()方法注册所需的广播接收器
3、注销广播接收器
unregisterReceiver ()
可节省系统资源及避免内存泄露
在 Activity 中,根据 Activity 的生命周期对广播接收器进 行注册及注销操作。 例如仅当 Activity 可见时才需要广播接收器的话,可以在onResume()中进行注册,在onPause()中进行注销
4、限制广播事件
非受限的广播 (unrestricted broadcast) 可能会引起安全的问题,因为任何广播接收器均可对其进行注册。
限制广播事件的方式:
(1)如不需与其他 App 进行通信,在本地 App 内使用本地广播;
(2)发送广播 Intent 对象时,通过setPackage()设置指定的应用 包名,广播事件将被限定传播给指定的 App;
(3)强制 (enforce) 广播事件发送端或接收端的访问权限:
- 强制发送端的权限,在sendBroadcast()方法中添加一个非空的权限参数。只有在AndroidManifest.xml文件中使用了<uses−permission>标签申请该权限 的广播接收器才能接收到该广播;
- 强制接收端的权限,动态注册的广播接收器,在registerReceiver ()添加一个非空的权限参数;静态注册的广播接收器,在AndroidManifest.xml文件的<receiver>标签中增加android:permission属性;