Android学习(三)——四大组件之BroadcastReceiver

Broadcast Receiver(广播接收者) 相关文章 什么是Service(服务)? Android开发-Intent(意图) Android四大组件,其中两项Activity和Service前面已经说过了,本次来说说第三项 Broadcast Receiver(广播接收者)。 1.1 广播接收者概念 BroadcastReceiver(广播接收者)是Android四大组件之一。 BroadcastReceiver是用于接收广播的组件,用于组件与组件之间进行通信,可以跨应用程序传递。 当有特定事件发生时,例如有来电、有短信、电池电量变化等事件发生 阅读详情

BroadcastReceiver基础使用

BroadCastReceiver简介

BroadCastReceiver,即广播接收器,运行在主线程用于监听全局广播

作为Android四大组件之一,BroadCastReceiver起着重要的作用,一般用于接收推送,跨进程通信等不方便直接通信操作的地方或者监听某些不定时完成的事务

广播主要有两种:有序广播和无序广播

  • 无序广播:所有跟广播的intent匹配的广播接收者都可以收到该广播,并且是没有先后顺序,效率搞,但是接收者不能传递也不能截断广播
  • 有序广播:所有跟广播的intent匹配的广播接收者都可以收到该广播,但是会按照广播接收者的优先级来决定接收的先后顺序,每一个接收者都有权修改并将修改的广播传给下一个接收者,也可以拦截。

BroadcastReceiver的实现原理

之前使用的时候并没有在意它的实现原理,只是知道这么用

广播的设计模式是标准的观察者模式,对于广播而言最重要的是Android的AMS(ActivityManagerService),消息发布者在AMS中注册,通过Binder机制发送广播,AMS在注册列表寻找到合适的接收者,将广播发送到接收者的消息循环队列(BroadcastQueue)中,广播接收者通过消息循环拿到广播并调用回调方法onReceive();

Created with Raphaël 2.1.0 发布者 发布者 AMS AMS 接收者 接收者 注册 注册 发广播 寻找合适的接收者 找到合适的接收者 发送广播到接收者消息队列 消息循环拿到该广播

这观察者模式好屌,吓得我赶紧去看这个设计模式怎么用了

定义一个BroadcastReceiver

定义个广播接收器还是挺简单的

  • 首先我们要新建一个类(至于是单独文件的类还是内部类这个要看使用场景,不过都可以的)并继承BroadcastReceiver类
  • 重写里面的onReceive方法
public class MyBroadcastReceiver extends BroadcastReceiver {

 @Override
 public void onReceive(Context context, Intent intent) {
     //接收广播后的操作
     } 
}

BroadcastReceiver的注册

作为Android四大组件之一,你Activity和Service都在Manifest里面注册了,我BroadcastReceiver要是不注册,我不要面子哒?

BroadcastReceiver的注册分为两种:静态注册和动态注册

静态注册

静态注册实在AndroidManifest里面添加 <receiver>标签

<receiver
     //是否能够实例化这个接收器可以为true,若为false则不能被实例化
    android:enabled=["true" | "false"]
    //此接收器能否接受其他APP发出的广播,如果内部包含intent-filter标签则默认为true,否则默认false
    android:exported=["true" | "false"]
    //一个代表广播接收器的图标,不定义默认为application标签的icon
    android:icon="drawable resource"
    android:label="string resource"//标签
    //这个属性一般为广播接收器实现类的类名(全名,要有包名的那种;或者直接.CLASSNAME,这样系统会默认吧manifest的包名加到前面)
    android:name="string"
    //这个属性用于定义把消息发送给该广播接收器的广播器所必须要有的权限。
    android:permission="string"
    这个属性用于设置该广播接收器应该运行在那个进程中的进程名。
    android:process="string">
    <intent-filter>
        //这里的action,就是我们发送的广播的事件名
        <action android:name="actionName" />
    </intent-filter>
</receiver>

当此app首次启动时,系统会自动实例化该广播接收器的实现类,并注册到系统中。

动态注册

是指不在Manifest里面添加标签,而是在代码中动态调用Context的registerReceiver()方法。

private MyBroadcastReceiver mBroadcastReceiver;

@Override 
protected void onResume(){ 
    super.onResume(); 
    mBroadcastReceiver = new MyBroadcastReceiver ();
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE); 

    registerReceiver(mBroadcastReceiver, intentFilter); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    unregisterReceiver(mBroadcastReceiver); 
} 

动态广播由于需要注销防止内存泄漏,所以推荐在onResume方法中注册,onPause方法中注销,同时重复注册,重复注销也不允许

在onResume()注册、onPause()注销是因为onPause()在App死亡前一定会被执行,从而保证广播在App死亡前一定会被注销,从而防止内存泄露。

静态注册与动态注册的区别

  • 两个方式的注册方式不同
    • 静态:在manifest中注册
    • 动态:在代码中注册
  • 两个方式的监听范围不同
    • 静态:会时刻监听广播
    • 动态:在特定时刻监听广播
  • 两个方式的生命周期不同
    • 静态:常驻后台,不受任何组件生命周期影响,耗电多占内存大
    • 动态:部常驻,灵活,跟随组件的生命周期变化,一旦移除就不会接受广播

发送广播

广播是通过sendBroadcast()方法,以Intent为传输工具进行发送的

广播主要分为5类:

  • 普通广播
  • 系统广播
  • 有序广播
  • 粘性广播
  • 应用内广播

普通广播

    Intent intent = new Intent();
    intent.setAction(NROMAL_ACTION);
    sendBroadcast(intent);

NROMAL_ACTION 就是你之前注册的广播事件

系统广播

这个并不是手动发送的,而是系统默认发送的,我们只需要监听就好

具体操作action名称
监听网络变化android.net.conn.CONNECTIVITY_CHANGE
关闭或打开飞行模式Intent.ACTION_AIRPLANE_MODE_CHANGED
充电时或电量发生变化Intent.ACTION_BATTERY_CHANGED
电池电量低Intent.ACTION_BATTERY_LOW
电池电量充足(即从电量低变化到饱满时会发出广播Intent.ACTION_BATTERY_OKAY
系统启动完成后(仅广播一次)Intent.ACTION_BOOT_COMPLETED
按下照相时的拍照按键(硬件按键)时Intent.ACTION_CAMERA_BUTTON
屏幕锁屏Intent.ACTION_CLOSE_SYSTEM_DIALOGS
设备当前设置被改变时(界面语言、设备方向等)Intent.ACTION_CONFIGURATION_CHANGED
插入耳机时Intent.ACTION_HEADSET_PLUG
未正确移除SD卡但已取出来时(正确移除方法:设置–SD卡和设备内存–卸载SD卡)Intent.ACTION_MEDIA_BAD_REMOVAL
插入外部储存装置(如SD卡)tent.ACTION_MEDIA_CHECKING
成功安装APKIntent.ACTION_PACKAGE_REMOVED
成功删除APKIntent.ACTION_BATTERY_CHANGED
重启设备Intent.ACTION_REBOOT
屏幕被关闭Intent.ACTION_SCREEN_OFF
屏幕被打开Intent.ACTION_SCREEN_ON
关闭系统时Intent.ACTION_SHUTDOWN
重启设备Intent.ACTION_REBOOT

当使用系统广播时,只需要在注册广播接收者时定义相关的action即可,并不需要手动发送广播,当系统有相关操作时会自动进行系统广播

有序广播

发送出去的广播被广播接收者按照先后顺序接收,这里的有序是针对接受者的

  • 广播接收的顺序规则
    • 按照Priority属性的值,从大到小排序
    • Priority属性的值相同时,动态注册的广播优先

使用方式

sendOrderedBroadcast(intent);

应用内广播

  • 注册广播时将exported属性设置为false,使得非本App内部发出的此广播不被接收;
  • 发送广播时指定该广播接收器所在的包名,此广播将只会发送到此包中的App内与之相匹配的有效广播接收器中,通过intent.setPackage(packageName)指定报名
  • 在广播发送和接收时,增设相应权限permission,用于权限验证;

    除了以上几种方式,也可以使用LocalBroadcastManager

  • 使用方式上与全局广播几乎相同,只是注册/取消注册广播接收器和发送广播时将参数的context变成了LocalBroadcastManager的单一实例,对于LocalBroadcastManager方式发送的应用内广播,只能通过LocalBroadcastManager动态注册,不能静态注册

    //注册应用内广播接收器 
    //步骤1:实例化BroadcastReceiver子类 & IntentFilter 
    MyBroadcastReceiver mBroadcastReceiver = new MyBroadcastReceiver ();
    IntentFilter intentFilter = new IntentFilter();
    localBroadcastManager = LocalBroadcastManager.getInstance(this); 
    //步骤3:设置接收广播的类型 
    intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE); 
    //步骤4:调用LocalBroadcastManager单一实例的registerReceiver()方法进行动态注册 
    localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter); 
    //取消注册应用内广播接收器 
    localBroadcastManager.unregisterReceiver(mBroadcastReceiver);
     //发送应用内广播 
    intent.setAction(BROADCAST_ACTION);
    localBroadcastManager.sendBroadcast(intent);

关于onReceive(Context context,Intent intent)方法

对于不同注册方式的广播接收器回调OnReceive(Context context,Intent intent)中的context返回值是不一样的

  1. 对于静态注册(全局+应用内广播),回调onReceive(context, intent)中的context返回值是:ReceiverRestrictedContext;
  2. 对于全局广播的动态注册,回调onReceive(context, intent)中的context返回值是:Activity Context;
  3. 对于应用内广播的动态注册(LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Application Context。
  4. 对于应用内广播的动态注册(非LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Activity Context;
Android BroadcastReceiver总结 #BroadcastReceiver综述 广播接收器,顾名思义,用来接收广播的。 一个广播关联两个角色,广播发送方、广播接收方,BroadcastReceiver是接收方角色。 广播发送方可以是应用内组件、其它应用,也可以是系统,BroadcastReceiver根据自己设置的过滤器IntentFilter来选择性接收。 BroadcastReceiver通过接收这些广播,实现了与其它组件、应用间的通信。 1.广播接收器注册时是被注册到系统,发送广播时也是... 阅读详情

相关推荐

保姆级教程:用Zemax 18.9复现单模光纤耦合仿真(附康宁SMF-28e参数)

本文提供了一份详细的Zemax 18.9单模光纤耦合仿真教程,以康宁SMF-28e为例,涵盖从软件设置、材料参数输入到系统构建和优化的全流程。通过光束耦合分析和物理光学传播(POP)技术,帮助用户准确模拟光纤耦合效率,并解决常见问题,适用于光学设计初学者和专业人士。

weixin_27330481的博客 316

BroadCast Receiver(广播)详解

BroadCastReceiver是四大组件之一,是一个全局的监听器BroadCastReceiver有两大功能,广播发送者,广播接收者BroadCastReceiver分为静态广播和动态动态广播。

suiyue010211的博客 8405

深入解析MTK DRM初始化流程:从KMS模块到组件框架

本文深入解析了联发科(MTK)平台上DRM显示框架的初始化流程。从内核模块加载、Component框架管理依赖,到核心的mtk_drm_bind函数构建KMS对象(CRTC、Plane、Encoder、Connector),最终完成DRM设备注册并创建用户空间接口。文章结合调试经验,为开发者梳理了从驱动启动到屏幕点亮的完整路径与关键排查点。

onion的博客 769

Android基础 - BroadcastReceiver全面解析

简介 BroadcastReceiver,同样是Android四大组件之一,有两个重要角色:广播发布者、广播接受者。 使用场景及作用 作用 用于接受或者监听应用发出来的广播,并作出相应的响应。 使用场景 用于不同组件间的通信,包括应用内和不同应用间的交互通信。 监听系统资源的变化,如网络变化、SD卡状态等 多进程的通信 实现原理 是典型观察者模式的应用,基于消息发布...

学习,思考,输出 3096

计算机技术发展5大阶段,现阶段计算机技术应用及发展

【摘要】现代计算机科学技术的发展和普及运用,为世界各国民众基础性生产生活实践活动的组织开展路径造成了深刻影响,本文围绕现阶段计算机技术应用及发展,择取两个具体方面,展开了简要分析。【关键词】计算机技术;应用;发展改革开放以来,计算机设备的广泛运用,促进了计算机科学技术的逐步发展成熟。计算机科学技术是具备新兴表现特征的尖端应用技术,其在现代工业生产和社会生活实践活动过程中的广泛引入运用,给世界各国基...

weixin_42126677的博客 2637

【2025年美团春招(算法岗)-3月15日-第三题(300分)- 字符串权值】(题目+思路+Java&C++&Python解析+在线测试)

小美定义一个字符串的权值为:其长度为3的回文子序列数量。例如,“abca"的权值为2,因为包含两个回文子序列"aba"和"aca现在给定一个仅包含小写字母的字符串,小美希望你输出该字符串每个前缀的权值。

m0_73659489的博客 312

broadcastreceiver全面详解

目录     1. 定义 即 广播,是一个全局的监听器,属于Android四大组件之一 Android 广播分为两个角色:广播发送者、广播接收者 2. 作用 监听 / 接收 应用 App 发出的广播消息,并 做出响应 3. 应用场景 Android不同组件间的通信(含 :应用内 / 不同应用之间) 多线程通信 与 Android 系统在特定情况下的通信 如:电话呼入时...

zyz18813049204的博客 4510

智能体异常行为检测-基于行为序列的异常模式识别技术【附代码】

在多智能体系统(Multi-Agent Systems, MAS)中,智能体之间的行为协调与自主决策是系统稳定运行的关键。然而,当某个智能体因策略偏移、环境变化或潜在攻击而出现**异常行为(Abnormal Behavior)**时,整个系统可能陷入混乱或崩溃。

一键难忘的博客 1146

Android四大组件学习笔记(三)_BroadcastReceiver

BroadcastReceiver & 基础组件BroadcastReceiver BroadcastReceiver 定义:   是一个全局的监听器,属于Android四大组件之一   Broadcast(广播)是一种广泛运用的在应用程序(APP)之间传输信息的机制。而BroadcastReceiver(广播接收器)是对发送出来的Broadcast进行过滤接收并响应的一类组件。 作用:   监听 / 接收 应用发出的广播消息,并做出响应。 应用场景: Android不同组件间的通信(同一应用内/

秀才恶霸的博客 331

材料仿真软件:Materials Studio_(14).电学性质计算

设置计算参数,包括 k 点网格、交换相关泛函等。

kkchenjj的博客 1868

华为OD机试真题 新系统 9月16号 【统计特殊数字】

华为OD新系统机试真题【统计特殊数字】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【统计特殊数字】。

qq_45776114的博客 775

Android 四大组件学习之BroadcastReceiver三

本节学习广播的分类。 广播分为无序广播和有序广播 无序广播: 广播发送者的action与广播接收者的action都匹配的话,所以广播介绍者都可以收到这条广播,并且没有先后顺序,可以认为是同时收到 有序广播: 广播发送者的action与广播接收者的action都匹配的话,所以广播介绍者都可以收到这条广播,但是有先后顺序,高优先级的先收到 既然知道什么是无序广播和有序广播后, 那我们

半月旋空 1005

机器人控制仿真软件:MATLAB Simulink Control System Toolbox_(1).MATLAB基础知识

MATLAB(Matrix Laboratory)是由MathWorks公司开发的一种高性能数值计算和可视化软件。它广泛应用于科学计算、工程设计、信号处理、控制系统设计、图像处理等领域。强大的矩阵运算能力:MATLAB的核心是矩阵运算,能够高效处理大规模的数值数据。丰富的工具箱:MATLAB提供了大量的工具箱,如Control System Toolbox、Simulink、Signal Processing Toolbox等,这些工具箱覆盖了多个应用领域。易于使用的图形界面。

kkchenjj的博客 907

储能系统架构与控制实战:从PCS到BMS的深度解析

储能系统的本质是一台多时间尺度协同的机器,从IGBT微秒级保护到云端分钟级调度,每个层级都有独立的控制目标与边界。理解这种分层架构,是定位现场疑难问题的基础——比如级联PID控制与FOC控制在PCS中的结合,既要设计合适的电流环带宽,也要处理弱电网下的PLL振荡风险。构网型控制(VSG/下垂)虽热,但下垂系数设置不当就会引发多机“抢功率”现象,而BMS的SOC/SOP协同、热管理与簇间均衡同样直接影响系统可用容量与安全。从设备控制到站级调度,从嵌入式软件分层到故障录波,工程稳定性源于架构设计的系统性思维。本

weixin_30399155的博客 279

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

安卓开发-03-四大组件

Android开发的四大组件

ning_xiao_xuan的博客 4798

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android中的四大组件详解

Android中的四大组件详解 我们都知道Android系统应用层框架中,为开发者提供了四大组件来便于应用的开发,它们是Activity、Service、BroadcastReceiver、ContentProvider。 它们用于在应用开发过程中,不同场景的功能实现。 Activity:Activity是开发中最常用的,也是最复杂的一个组件。它是用户可以专注做一些事情的东西。它的主要功能就是可以和用户进行交互操作,所以几乎所有的Activity都会负责创建一个显示窗口,然后通过setContentView

joye123的博客 7564

Android题集四大组件之Content provider、BroadcastReceiver

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人。

2401_85730911的博客 950

Android四大组件——BroadcastReceiver详解

一、 定义 BroadcastReceiver(广播接收器),属于Android四大组件之一 在Android开发中,BroadcastReceiver的应用场景非常多广播,是一个全局的监听器,属于Android四大组件之一 Android 广播分为两个角色:广播发送者、广播接收者 二、 作用 用于监听 / 接收 应用发出的广播消息,并做出响应 应用场景 a. 不同组件之间通信(包括应用内 / 不同应用之间) b. 与 Android 系统在特定情况下的通信 如当电话呼入时、网络可用时

QLHepburn的博客 1679

Android四大组件详解

Android四大组件详解 文章目录Android四大组件详解四大组件的不同点一、Activity二、Service三、Broadcast Receiver四、Content Provider四大组件相同点4大组件的注册4大组件的激活4大组件的关闭android中的任务(activity栈) Android四大组件分别是活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供器(Content Provider)。 活动(activity)是所有A

爱笑的博客 1万+

android四大组件(Activity,Service,BroadcastReceiver,Content Provider)

安卓的四大组建,五大布局Android四大组件:Activity、Service、Broadcast Receiver、Content Provider。1、 Activity 可以去本人博客activity了解学习是Android程序与用户交互的窗口,从视觉效果来看,一个Activity占据当前的窗口,响应所有窗口事件,具备有控件,菜单等界面元素。从内部逻辑来看,Activity需要为了保持各个

Mr_haimeng的博客 1358

Android 四大组件——BroadcastReceiver(广播)

本文全面解析Android四大组件之一的BroadcastReceiver。主要内容包括:1)广播接收器定义及核心设计思想,作为响应系统或应用内事件的"事件监听器";2)工作原理,包括系统匹配和执行流程;3)两种广播类型(标准广播和有序广播)及使用示例;4)两种注册方式(静态和动态);5)本地广播的优势及使用方法;6)安全考量如权限设置和exported属性;7)最佳实践,包括避免耗时操作和生命周期管理;8)常用系统广播列表。文中通过有序广播的完整示例,演示了从权限检查到最终处理的链式流

indeedes的博客 1009

Android 四大组件之 ContentProvider 与 BroadcastReceiver

四大组件里,Activity 是"看得见的脸"、Service 是"看不见的腿",剩下两个是搭起整个系统协作骨架的"管道"。

2301_76797664的博客 521

【Android】四大组件之BroadcastReceiver

BroadcastReceiver用于监听系统或应用发出的广播事件,实现跨组件通信。

贫道绝缘子的博客 2070

Android 四大组件全面解析

Activity:主线程 5 秒内未响应输入事件(如点击、触摸);Service:主线程 20 秒内未完成或onBind();方法 10 秒内未执行完毕;:主线程执行query()等操作超过 10 秒(间接导致 ANR)。解决方式:耗时操作放在子线程,避免阻塞主线程。

2401_89387076的博客 1749

【安卓四大组件--android app】

Android四大核心组件包括Activity、Service、BroadcastReceiver和ContentProvider。Activity负责界面展示,具有完整的生命周期(onCreate-onDestroy);Service用于后台任务,支持startService和bindService两种启动方式;BroadcastReceiver接收系统或应用广播,通过onReceive响应;ContentProvider实现跨应用数据共享。各组件通过Intent通信,配合生命周期管理实现不同功能场景。

xx 1406

Android四大组件---BroadcastReceiver

前言: BroadcastReceiver(广播接收器),属于Android四大组件之一 在Android开发中,BroadcastReceiver的应用场景非常多 今天,我将详细讲解关于BroadcastReceiver的一切相关知识 目录: 下面小可会把自己使用广播的心得体会以及广播dev具体用途详细的讲解。 1:定义 广播,是一个全局的监听器,属于Android四...

hirezy 1928
上一篇: Android学习(2.5)—— Service 与 IntentService
下一篇: Android学习(四)——四大组件之ContentProvider
豪利丶王
博客等级 码龄11年 1粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值