百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Android中的广播Broadcast详解_android 广播

toyiye 2024-04-03 23:10 17 浏览 0 评论

1,Broadcast是android中的四大组件之一

2,广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”。普通广播是完全异步的,可以在同一时刻(逻辑上)被所有广播接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播;然而有序广播是按照接收者声明的优先级别(声明在intent-filter元素的android:priority属性中,数越大优先级别越高,取值范围:-1000到1000。也可以调用IntentFilter对象的setPriority()进行设置),被接收者依次接收广播。如:A的级别高于B,B的级别高于C,那么,广播先传给A,再传给B,最后传给C。A得到广播后,可以往广播里存入数据,当广播传给B时,B可以从广播中得到A存入的数据。

Context.sendBroadcast()

发送的是普通广播,所有订阅者都有机会获得并进行处理。

Context.sendOrderedBroadcast()

发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者,前面的接收者有权终止广播(BroadcastReceiver.abortBroadcast()),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。对于有序广播,前面的接收者可以将处理结果存放进广播Intent,然后传给下一个接收者。

3,示例

第一步:定义广播接收者,继承BroadcastReceiver,并重写onReceive()方法。

  1. publicclass IncomingSMSReceiver extendsBroadcastReceiver {

  2. @Overridepublicvoid onReceive(Contextcontext, Intentintent) {

  3. }

  4. }

第二步:订阅感兴趣的广播Intent,订阅方法有两种:

第一种:使用代码进行订阅(动态订阅)

  1. IntentFilter filter = newIntentFilter("android.provider.Telephony.SMS_RECEIVED");

  2. IncomingSMSReceiver receiver = newIncomingSMSReceiver();

  3. registerReceiver(receiver, filter);

第二种:在AndroidManifest.xml文件中的<application>节点里进行订阅(静态订阅)

  1. <receiverandroid:name=".IncomingSMSReceiver">

  2. <intent-filter>

  3. <actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>

  4. </intent-filter>

  5. </receiver>

静态注册字段

字段解释
android:bannerA Drawable resource providing an extended graphical banner for its associated item. 一个Drawable资源为其相关联的项目提供扩展的图形横幅。
android:descriptionDescriptive text for the associated data. 为关联数据提供描述。
android:directBootAwareIndicate if this component is aware of direct boot lifecycle, and can be safely run before the user has entered their credentials (such as a lock pattern or PIN). 指示此组件是否知道直接引导生命周期,并且可以在用户输入其凭据(例如锁定模式或PIN)之前安全运行。
android:enabledSpecify whether the receiver is enabled or not (that is, can be instantiated by the system). 指定这个接收者是否被开启。是否被系统注册。
android:exportedFlag indicating whether the given application component is available to other applications. 指示给定应用程序组件是否可用于其他应用程序的标志。
android:iconA Drawable resource providing a graphical representation of its associated item. 一个可绘制的资源,提供其关联项目的图形表示。
android:labelA user-legible name for the given item. 给定项目的用户可读名称。
android:logoA Drawable resource providing an extended graphical logo for its associated item. 一个Drawable资源,为其相关联的项目提供扩展的图形标志。
android:nameRequired name of the class implementing the receiver, deriving from BroadcastReceiver. 实现接收器的类的所需名称,源自BroadcastReceiver。
android:permissionSpecify a permission that a client is required to have in order to use the associated object. 指定客户机必须具有的权限才能使用关联的对象。
android:processSpecify a specific process that the associated code is to run in. 指定一个指定的进程让关联的代码在此上运行。
android:roundIconA Drawable resource providing a graphical representation of its associated item. 一个可绘制的资源,提供其关联项目的图形表示。
android:singleUserIf set to true, a single instance of this component will run for all users. 如果设置为true,则此组件的单个实例将为所有用户运行。

动态广播订阅和静态广播订阅的区别:

静态订阅广播又叫:常驻型广播,当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接受到,他的注册方式就是在你的应用程序中的AndroidManifast.xml进行订阅的。

动态订阅广播又叫:非常驻型广播,当应用程序结束了,广播自然就没有了,比如你在activity中的onCreate或者onResume中订阅广播,同时你必须在onDestory或者onPause中取消广播订阅。不然会报异常,这样你的广播接收器就一个非常驻型的了。

这里面还有一个细节那就是这两种订阅方式,在发送广播的时候需要注意的是:动态注册的时候使用的是隐式intent方式的,所以在发送广播的时候需要使用隐式Intent去发送,不然是广播接收者是接收不到广播的,这一点要注意。但是静态订阅的时候,因为在AndroidMainfest.xml中订阅的,所以在发送广播的时候使用显示Intent和隐式Intent都可以(当然这个只针对于我们自己定义的广播接收者),所以以防万一,我们一般都采用隐式Intent去发送广播。

4,系统常用广播

//关闭或打开飞行模式时的广播

Intent.ACTION_AIRPLANE_M;

//充电状态,或者电池的电量发生变化;//电池的充电状态、电荷级别改变,不能通过组建声;

Intent.ACTION_BATTERY_CH;

//表示电池电量低

Intent.ACTION_BATTERY_LO;

//表示电池电量充足

Intent.ACTION_BATTERY_OK;

//关闭或打开飞行模式时的广播

Intent.ACTION_AIRPLANE_MODE_CHANGED;

//充电状态,或者电池的电量发生变化//电池的充电状态、电荷级别改变,不能通过组建声明接收这个广播,只有通过Context.registerReceiver()注册

Intent.ACTION_BATTERY_CHANGED;

//表示电池电量低

Intent.ACTION_BATTERY_LOW;

//表示电池电量充足,即从电池电量低变化到饱满时会发出广播

Intent.ACTION_BATTERY_OKAY;

//在系统启动完成后,这个动作被广播一次(只有一次)。

Intent.ACTION_BOOT_COMPLETED;

//按下照相时的拍照按键(硬件按键)时发出的广播

Intent.ACTION_CAMERA_BUTTON;

//当屏幕超时进行锁屏时,当用户按下电源按钮,长按或短按(不管有没跳出话框),进行锁屏时,android系统都会广播此Action消息

Intent.ACTION_CLOSE_SYSTEM_DIALOGS;

//设备当前设置被改变时发出的广播(包括的改变:界面语言,设备方向,等,请参考Configuration.java)

Intent.ACTION_CONFIGURATION_CHANGED;

//设备日期发生改变时会发出此广播

Intent.ACTION_DATE_CHANGED;

//设备内存不足时发出的广播,此广播只能由系统使用,其它APP不可用

Intent.ACTION_DEVICE_STORAGE_LOW;

//设备内存从不足到充足时发出的广播,此广播只能由系统使用,其它APP不可用

Intent.ACTION_DEVICE_STORAGE_OK;

//发出此广播的地方frameworks\base\services\java\com\android\server\DockObserver.java

Intent.ACTION_DOCK_EVENT;

//移动APP完成之后,发出的广播(移动是指:APP2SD)

Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE;

//正在移动APP时,发出的广播(移动是指:APP2SD)

Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE;

//Gtalk已建立连接时发出的广播

Intent.ACTION_GTALK_SERVICE_CONNECTED;

//Gtalk已断开连接时发出的广播

Intent.ACTION_GTALK_SERVICE_DISCONNECTED;

//在耳机口上插入耳机时发出的广播

Intent.ACTION_HEADSET_PLUG;

//改变输入法时发出的广播

Intent.ACTION_INPUT_METHOD_CHANGED;

//设备当前区域设置已更改时发出的广播

Intent.ACTION_LOCALE_CHANGED;

//表示用户和包管理所承认的低内存状态通知应该开始。

Intent.ACTION_MANAGE_PACKAGE_STORAGE;

//未正确移除SD卡(正确移除SD卡的方法:设置--SD卡和设备内存--卸载SD卡),但已把SD卡取出来时发出的广播 ,扩展介质(扩展卡)已经从 SD 卡插槽拔出,但是挂载点 (mount point) 还没解除 (unmount)

Intent.ACTION_MEDIA_BAD_REMOVAL;

//按下"Media Button" 按键时发出的广播,假如有"Media Button" 按键的话(硬件按键)

Intent.ACTION_MEDIA_BUTTON;

//插入外部储存装置,比如SD卡时,系统会检验SD卡,此时发出的广播?

Intent.ACTION_MEDIA_CHECKING;

//已拔掉外部大容量储存设备发出的广播(比如SD卡,或移动硬盘),不管有没有正确卸载都会发出此广播, 用户想要移除扩展介质(拔掉扩展卡)。

Intent.ACTION_MEDIA_EJECT;

//插入SD卡并且已正确安装(识别)时发出的广播, 扩展介质被插入,而且已经被挂载。

Intent.ACTION_MEDIA_MOUNTED;

//拓展介质存在,但使用不兼容FS(或为空)的路径安装点检查介质包含在Intent.mData领域。

Intent.ACTION_MEDIA_NOFS;

//外部储存设备已被移除,不管有没正确卸载,都会发出此广播, 扩展介质被移除。

Intent.ACTION_MEDIA_REMOVED;

//广播:已经扫描完介质的一个目录

Intent.ACTION_MEDIA_SCANNER_FINISHED;

//请求媒体扫描仪扫描文件并将其添加到媒体数据库。

Intent.ACTION_MEDIA_SCANNER_SCAN_FILE;

//广播:开始扫描介质的一个目录

Intent.ACTION_MEDIA_SCANNER_STARTED;

// 广播:扩展介质的挂载被解除 (unmount),因为它已经作为 USB 大容量存储被共享。

Intent.ACTION_MEDIA_SHARED;

Intent.ACTION_MEDIA_UNMOUNTABLE;//

// 广播:扩展介质存在,但是还没有被挂载 (mount)

Intent.ACTION_MEDIA_UNMOUNTED

Intent.ACTION_NEW_OUTGOING_CALL;

//成功的安装APK之后//广播:设备上新安装了一个应用程序包。//一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播)

Intent.ACTION_PACKAGE_ADDED;

//一个已存在的应用程序包已经改变,包括包名

Intent.ACTION_PACKAGE_CHANGED;

//清除一个应用程序的数据时发出的广播(在设置--应用管理--选中某个应用,之后点清除数据时?)//用户已经清除一个包的数据,包括包名(清除包程序不能接收到这个广播)

Intent.ACTION_PACKAGE_DATA_CLEARED;

//触发一个下载并且完成安装时发出的广播,比如在电子市场里下载应用?

Intent.ACTION_PACKAGE_INSTALL;

//成功的删除某个APK之后发出的广播, 一个已存在的应用程序包已经从设备上移除,包括包名(正在被安装的包程序不能接收到这个广播)

Intent.ACTION_PACKAGE_REMOVED;

//替换一个现有的安装包时发出的广播(不管现在安装的APP比之前的新还是旧,都会发出此广播?)

Intent.ACTION_PACKAGE_REPLACED;

//用户重新开始一个包,包的所有进程将被杀死,所有与其联系的运行时间状态应该被移除,包括包名(重新开始包程序不能接收到这个广播)

Intent.ACTION_PACKAGE_RESTARTED;

//插上外部电源时发出的广播

Intent.ACTION_POWER_CONNECTED;

//已断开外部电源连接时发出的广播

Intent.ACTION_POWER_DISCONNECTED;

Intent.ACTION_PROVIDER_CHANGED;//

//重启设备时的广播

Intent.ACTION_REBOOT;

//屏幕被关闭之后的广播

Intent.ACTION_SCREEN_OFF;

//屏幕被打开之后的广播

Intent.ACTION_SCREEN_ON;

//关闭系统时发出的广播

Intent.ACTION_SHUTDOWN;

//时区发生改变时发出的广播

Intent.ACTION_TIMEZONE_CHANGED;

//时间被设置时发出的广播

Intent.ACTION_TIME_CHANGED;

//广播:当前时间已经变化(正常的时间流逝), 当前时间改变,每分钟都发送,不能通过组件声明来接收

,只有通过Context.registerReceiver()方法来注册

Intent.ACTION_TIME_TICK;

//一个用户ID已经从系统中移除发出的广播

Intent.ACTION_UID_REMOVED;

//设备已进入USB大容量储存状态时发出的广播?

Intent.ACTION_UMS_CONNECTED;

//设备已从USB大容量储存状态转为正常状态时发出的广播?

Intent.ACTION_UMS_DISCONNECTED;

Intent.ACTION_USER_PRESENT;//

//设备墙纸已改变时发出的广播

Intent.ACTION_WALLPAPER_CHANGED;

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码