当前位置:   article > 正文

Android | 广播( Broadcast )_android 发送广播

android 发送广播

一、广播

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属性;
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/472266
推荐阅读
相关标签
  

闽ICP备14008679号