BroadCast Receiver

简介

BroadcastReceiver即广播,是一个全局的监听器,属于Android四大组件之一
Android 广播分为两个角色:广播发送者、广播接收者
作用是监听 / 接收 应用 App 发出的广播消息,并 做出响应
一般应用场景如下

Android不同组件间的通信(含 :应用内 / 不同应用之间)
多线程通信
与 Android 系统在特定情况下的通信(如电话呼入时、网络可用时)

原理

Android中的广播使用了设计模式中的观察者模式:基于消息的发布 / 订阅事件模型
模型中有3个角色:
a. 消息订阅者(广播接收者)
b. 消息发布者(广播发布者)
c. 消息中心(AMS,即Activity Manager Service)
原理概述
a. 广播接收者通过Binder机制在AMS注册
b. 广播发送者通过Binder机制向AMS发送广播
c. AMS根据广播发送者要求,在已注册的列表中寻找合适的广播接收者(寻找依据 IntentFilter/Permission)
d. AMS将广播发送到合适的广播接收者的消息循环队列中
e. 广播接收者通过消息循环拿到此广播,并回调onReceive();
特别注意广播发送者和广播接收者的执行是异步的,即广播发送者不关心有无接收者接收,也不确定接收者何时才能接收到

使用步骤

第一步:自定义广播接收者 BroadcastReceiver

  1. 继承 BroadcastReceivre 基类
  2. 必须复写抽象方法 onReceive() 方法
  • 广播接收器接收到相应广播后,会自动回调 onReceive() 方法
  • 一般情况下,onReceive方法会涉及与其他组件之间的交互,如发送 Notification 、 启动 Service 等
  • 默认情况下,广播接收器运行在 UI 线程,因此,onReceive()方法不能执行耗时操作,否则将导致ANR

//点击通知栏按钮,实现切换(给通知栏添加点击事件)

1
2
3
4
5
6
7
8
9
class MyBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action == "com.example.MY_ACTION") {
// 在接收到指定Action的广播时执行操作
val message = intent.getStringExtra("message")
Toast.makeText(context, "Received broadcast: $message", Toast.LENGTH_SHORT).show()
}
}
}

注册广播接收器

a. 静态注册
需要在 AndroidManifest.xml 文件中注册这个 BroadcastReceiver ,并设置接收的 Action 和相关的权限:
当此 App首次启动时,系统会自动实例化 MyBroadcastReceiver 类,并注册到系统中

1
2
3
4
5
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.example.MY_ACTION" />
</intent-filter>
</receiver>

b. 动态注册
注册方式:在代码中调用 Context.registerReceiver() 方法
注销方式:在代码中调用 Context.unregisterReceiver() 方法

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2023-2025 Annie
  • Visitors: | Views:

嘿嘿 请我吃小蛋糕吧~

支付宝
微信