赞
踩
由 Android 系统进行发送,通常表示系统级事件发生。 系统广播由 Intent 意图对象进行封装。该 Intent 对象中的 action 字段包含了表示事件的详细信息字符串签名。
由 App 自身进行发送。为了通知其他 App 或本 App中的其他组件某一事件已经发生。对这类事件感兴趣的 App 或组件可以及注册该自定义广播的广播接收器。
注册系统或 App 的广播事件。当事件发生时,注册了该事件的广播接收器被系统通过Intent 对象激活。
使用广播接收器的步骤包括:
1 子类化 BroadcastReceiver并实现onReceive()方法;
2 通过静态或动态方式注册广播接收器
3 注销广播接收器
当广播事件的 Intent 对象与该子类注册时的 intent filter匹配时,该广播接收器子类将接收 Intent 对象,并通过onReceive()方法响应广播事件。
当 App 收到一个已注册的广播 Intent 对象时, BroadcastReceiver类中的onReceive()方法被回调。onReceive()方法默认主线程中执行,除非在注册时显式的指定该方法在其他线程执行。onReceive()方法中的代码执行时间若超过 10 秒,Android 系统将判定广播接收器被阻塞,此时系统将可能向用户提示 ANR (application not responding) 错误。
静态注册,通过 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回调方法执行前),广播接收器均能接收到注册的广播事件。
步骤:
unregisterReceiver ()
可节省系统资源及避免内存泄露
在 Activity 中,根据 Activity 的生命周期对广播接收器进 行注册及注销操作。 例如仅当 Activity 可见时才需要广播接收器的话,可以在onResume()中进行注册,在onPause()中进行注销
非受限的广播 (unrestricted broadcast) 可能会引起安全的问题,因为任何广播接收器均可对其进行注册。
限制广播事件的方式:
(1)如不需与其他 App 进行通信,在本地 App 内使用本地广播;
(2)发送广播 Intent 对象时,通过setPackage()设置指定的应用 包名,广播事件将被限定传播给指定的 App;
(3)强制 (enforce) 广播事件发送端或接收端的访问权限:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。