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


猜你喜欢
- 在SpringAMQP的发送方法中,接收消息的类型是Object,也就是说我们可以发送任意对象类型的消息,SpringAMQP会帮我们序列化
- 1.MapView ,MapActivity 这种的局限在于,必须要继承MapActivity,否则无法使用MapView。纠结就在于此。但
- 今天老师留的作业,使用俩个Fragment来实现3D翻转效果,遇到了一点点的问题,于是在网上进行了查找,但是发现有些博主的代码不正确,对其他
- 今天一上班 被github上的一篇名为《教你用python玩跳一跳》吸引,它的星也瞬间从3400涨到4400 原作者主要就是用py
- Android中子线程和UI线程之间通信的详细解释 1.在多线程编程这块,我们经常要使用Handler,Thread和Runnable这三个
- 真实的多线程业务开发中,最常用到的逻辑就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行l
- 一、问题描述今天使用SDK Manager将Android SDK的版本更新到了Android 5.1的版本,eclipse创建androi
- 前言最近代码里和WebView有很多的交互,webview是android中的浏览器控件,这里主要介绍一下webview如何重载WebVie
- DebugLZQ在网上搜索相关文件加密的程序,发现给出的基本都是针对“字符创”、“文本”的加密与解密。对视频文件、图片等一般文件的加密解密程
- 因为在framework中想添加这个功能,所以写了个appliction来实现一下获取正在运行的应用程序: 还是先看图吧: 这个app主要是
- 一、前言null与NULL不都是表示空值吗?这有什么值得深入讨论的的?首先你在编写Java代码时使用过NULL吗?大概用IDE用习惯了,自动
- 本文项目为大家分享了C#实现点餐系统,供大家参考,具体内容如下项目介绍:一家店铺使用的外卖点餐系统本项目分三大模块:登录注册模块,用户模块,
- 单一职责原则:一个类,只有一个引起它变化的原因。为什么需要单一职责原则?如果一个类有多个原因要去修改它,那么修改一个功能时,可能会让其他功能
- 目录第一点——加载网页结构第二点——解析网页结构,转变为符合需求的数据实体第三点——保存数据实体,转变为符合需求的数据实体第四点——main
- 在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系。可是有的时候,可能存在多个线程多同一个数据进行操作,这样
- 在前面仿华为加载动画、仿网易音乐听歌识曲-麦克风动画中,我们通过绘图的基础知识完成了简单的绘制。在本例中,我们将绘制常见的验证码。一、效果图
- 话不多说直接上代码,简单明了import java.io.File;import java.io.FileInputStream;impor
- 使用try-with-resource机制关闭连接JAVA的一大特性就是JVM会对内部资源实现自动回收即自动GC,给开发者带来了极大的便利。
- 本文讲述了在Java中如何创建和结束线程的最基本方法,只针对于Java初学者。一些高级知识如线程同步、调度、线程池等内容将会在后续章节中逐步
- json格式的字符串与对象的互相转换Jackson 简介Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转