Android四大组件之BroadcastReceiver详解

作者:*是杯酒渐浓* 时间:2023-03-17 02:55:08 

BroadcastReceiver(广播 * ),在Android开发中,BroadcastReceiver的应用场景非常多,属于Android四大组件之一。

Android 广播分为两个角色:广播发送者、广播接收者

一、 作用

用于监听 / 接收 应用发出的广播消息,并做出响应

应用场景:

  • 不同组件之间通信(包括应用内 / 不同应用之间)

  • 与 Android 系统在特定情况下的通信(如当电话呼入时、网络可用时)

  • 多线程通信

二、实现原理

Android中的广播使用了设计模式中的观察者模式:基于消息的发布/订阅事件模型。

模型中有3个角色:

  • 消息订阅者(广播接收者)

  • 消息发布者(广播发布者)

  • 消息中心(AMS,即Activity Manager Service)

广播接收者通过 Binder机制在AMS注册
广播发送者通过 Binder 机制向AMS发送广播
AMS根据广播发送者要求,在已注册列表中,寻找合适的广播接收者(寻找依据:IntentFilter / Permission)
AMS将广播发送到合适的广播接收者相应的消息循环队列中;
广播接收者通过消息循环拿到此广播,并回调 onReceive()

三、广播 * 注册

注册的方式分为两种:静态注册、动态注册

静态注册

在AndroidManifest.xml里通过 标签声明


<receiver
//此广播接收者类是mBroadcastReceiver
android:name=".mBroadcastReceiver" >
//用于接收网络状态改变时发出的广播
<intent-filter>
  <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>

当此App首次启动时,系统会自动实例化mBroadcastReceiver类,并注册到系统中。

静态注册是常驻广播,不受任何组件生命周期的影响

动态注册

在代码中通过调用Context的*registerReceiver()方法进行动态注册BroadcastReceiver


@Override
protected void onResume() {
 super.onResume();
 //实例化BroadcastReceiver子类 & IntentFilter
 mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
 IntentFilter intentFilter = new IntentFilter();
 //设置接收广播的类型
 intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
 //调用Context的registerReceiver()方法进行动态注册
 registerReceiver(mBroadcastReceiver, intentFilter);
}

注册广播后,要在相应位置记得销毁广播

即在onPause() 中unregisterReceiver(mBroadcastReceiver)

当此Activity实例化时,会动态将MyBroadcastReceiver注册到系统中

当此Activity销毁时,动态注册的MyBroadcastReceiver将不再接收到相应的广播。


@Override
protected void onPause() {
 super.onPause();
 //销毁在onResume()方法中的广播
 unregisterReceiver(mBroadcastReceiver);
}

注意:

动态广播最好在Activity的onResume()注册、onPause()注销。

原因:

对于动态广播,有注册就必然得有注销,否则会导致内存泄露
重复注册、重复注销也不允许
动态注册是非常驻广播,灵活,跟随组件的生命周期变化。

来源:https://blog.csdn.net/weixin_43560292/article/details/86676887

标签:android,broadcastreceiver
0
投稿

猜你喜欢

  • c#使用filesystemwatcher实时监控文件目录的添加和删除

    2021-12-04 18:01:57
  • C#的十种语法糖介绍

    2022-07-24 04:55:49
  • Java常用锁synchronized和ReentrantLock的区别

    2023-06-01 04:42:21
  • Java语言中Swing组件编程详解

    2023-04-19 04:08:22
  • java计算给定字符串中出现次数最多的字母和该字母出现次数的方法

    2022-01-13 03:00:04
  • SpringBoot中发送QQ邮件功能的实现代码

    2022-09-25 10:19:59
  • hadoop实现grep示例分享

    2023-12-24 05:31:04
  • 浅析C#中StringBuilder类的高效及与String的对比

    2022-09-14 15:54:04
  • java解析excel文件的方法

    2023-05-13 15:53:44
  • 浅谈@Aspect@Order各个通知的执行顺序

    2021-10-24 19:00:38
  • springboot项目配置swagger2示例详解

    2021-09-01 04:24:47
  • C#开发微信门户及应用(4) 关注用户列表及详细信息管理

    2023-06-05 07:40:43
  • Java京东面试题之为什么HashMap线程不安全

    2022-12-06 07:20:02
  • Spring Boot基础学习之Mybatis操作中使用Redis做缓存详解

    2023-01-19 16:35:55
  • Android动态修改应用图标与名称的方法实例

    2021-11-21 13:24:44
  • 详解Java中Duration类的使用方法

    2021-07-30 20:09:28
  • java 中接口和抽象类的区别与对比

    2022-07-09 04:13:03
  • Android实现左右滑动切换图片

    2021-06-20 10:51:30
  • C#使用List类实现动态变长数组的方法

    2022-11-30 03:44:35
  • Android保持屏幕常亮唤醒状态的方法

    2021-05-30 15:15:29
  • asp之家 软件编程 m.aspxhome.com