广播接收器类概述


这是用于接收由sendBroadcast()发送intent的基类。这个类一般都会被继承重写里面的onReceive()方法。。
如果您不需要跨应用程序发送广播,请考虑使用LocalBroadcastManager中的此类,而不是使用下面描述的更通用的工具。这样可以只接受或发送当前应用中的广播。。
您可以使用Context.registerReceiver()动态注册该类的实例,或者通过AndroidManifest.xml中的<.>标记静态发布实现。。
如果在Activity.onResume()实现中注册一个接收器,则应该在Activity.onPause()中注销它。(暂停时不会收到意图,这将减少不必要的系统开销)。

广播主要分为2大类:

关于广播你首先要清楚:广播的传输过程数据传输过程完全异步。 异步的定义为:接收方完全不知道发送方什么时候发送,但发送方一发送,就会提醒接受方接收,至于接受方接不接受,发送方不管了,就去干其他的事了。如果这个过程是同步的话,那么发送方一定会确定接收方接受后才会继续发送,否则就等待。在广播系统中,很显然用异步机制才更合理。
由于异步这个特征,广播可以分为两类:
1.无序广播(正常广播):最纯粹的广播,就是具有以上基本特征的广播。
2.有序广播:在正常广播基础上添加了接收广播优先权的特征。广播一次传递给一个接收器。接收器按优先级priority接收。优先接收到广播的接收器可以中止广播,让广播不在继续往下传递。具有相同优先级的接收器接收广播的顺序随机。
即使在正常广播的情况下,系统在某些情况下也可以恢复成一次只传送给一个接收器。特别的,对于可能需要创建进程的接收器,一次只运行一个,以避免新进程使系统过载。然而,这种情况下,非有序语义保持,这些接收器仍然不能返回结果或中止他们的广播。(这一条在开进程接收广播的情况下要注意的细节,以你的水平,先忽略吧。)
以下这一点,最近才知道,重点标注一下。
尽管intent类用于发送和接收广播,但是这里的intent广播机制与使用Content.startActivity()启动活动的Intent是完成独立的。广播接收器无法查看或捕获与startActivity()一起使用的intent,同样,在发送广播intent时,这个intent也不会被活动给捕获到。这两个操作在语义上非常不同:使用intent启动活动是修改用户当前与之交互内容的前台操作;广播intent是用户通常不知道的背景操作
BroadcastReceiver类当通过清单标记位组件启动时,那它的生命周期就是整个应用程序的生命周期。
主题包括:
1.安全性
与上下文API一起使用的接收者本质上是跨应用程序的工具,因此必须考虑其他应用程序可能如何滥用它们。一些需要考虑的事情是:
(1).意图命名空间是全局的,确保你在自己的意图命名空间中写入了意图操作名称和其他字符串,否则可能会和其他应用程序相冲突。
(2).当你注册了广播接收器时,任何应用程序都可以通过向该接收器发送广播,你可以通过以下方法控制谁可以向你发送广播。
(3)当你在应用程序的清单中发布接收器并为其制定意图过滤器时,任何其它应用程序都可以向其发送广播,而不管你指定的过滤器是什么。也就是说你可以不接受,但你不能阻止别人不发送给你。为了防止其他人发送给你,可以设置exported = false.
(4)当使用sendBroadcast()或相关方法时,通常任何其他应用程序都可以接受这些广播。你可以通过以下权限来控制谁可以接受这样的广播,或者使用intent.setPackage安全地将广播限制到单个应用程序.
当你使用LocalBroadcastManager,上面那些跨程序接受广播的问题都不存在,所以这种广播永远不会在当前进程之外。所以你要学会使用当你使用LocalBroadcastManager。
访问权限可以由广播的发送者或接收者强制执行。

  • 若要在发送时强制执行权限,请向sendBroadcast(Intent,String)或sendOrderedBroadcast(Intent,String,BroadcastReceiver,android.os.Handler,int,String,Bundle)提供非空权限参数。只有被授予此权限的接收者(通过在其AndroidManifest.xml中使用<use-permission>标记请求它)才能够接收广播。
  • 为了在接收时强制执行权限,在注册接收器时提供非空权限——在调用registerReceiver(BroadcastReceiver,IntentFilter,String,android.os.Handler)时或者在AndroidManifest.xml.只有被授予此权限的广播商(通过在其AndroidManifest.xml中使用<use-permission>标记请求它)才能够向接收器发送Intent.

2.接收器生命周期
接收器对象只对调用onReceive()的持续时间有效。一旦你的代码从这个函数返回,系统就认为该对象将被完成并且不再激活。
这对于在onReceive()实现中可以执行的操作有重要的影响任何需要异步操作的操作都不可用。因为需要函数返回来处理异步操作结果,但此时接收器不是较长的活动,因此系统可以自由的在异步操作完成之前完成它的进程。
特别是,你可能不会在广播接收器中显示对话或绑定服务。对于前者,你应该使用NotificationManager(),对于后者,可以使用Context.startService()向服务发送命令。因为你若在广播里绑定服务,那么服务的生命周期就如同广播一样短了。
进程生命周期
当前正在执行BroadcastReceiver(执行onReceive代码)的进程被认为是前台进程,系统将保持运行,除非在极端内存压力的情况下。 一旦从onReceive()返回,BroadcastReceiver就不再是活动的,并且它的宿主进程只与运行在其中的任何其他应用程序组件一样重要。这一点尤其重要,因为该进程仅仅托管BroadcastReceiver,那么当从onReceiver()返回时,系统将认为其进程是空的,并积极的杀死它,从而将资源用于其他更重要的过程。
这意味着,对于长时间的操作,你通常可以将服务和BroadcastReceive结合使用,以便在操作的整个时间保持包含的进程为活动的。例如在服务里频繁的发送广播给接收器,让它保持活动状态.

LocalBroadcastManager

上面提到过这个类,作为在自己应用中发送接受广播,它是你的首选,所以来看看它的描述。
帮助你注册和发送内容到你的进程中的本地对象的广播,相比于发送全球广播有很多优点

你知道你正在播放的数据不会离开你的应用程序,所以不必担心泄露私人数据。
其他应用程序不可能将这些广播发送到您的应用程序,因此您不必担心它们可能利用安全漏洞。
它比通过系统发送全球广播更有效。
这些优点,看了之后就用它了。

总结:理清广播的发送流程很重要,要不然很容易被动态注册、静态注册,有序广播,无序广播这些名词给搞晕。首先,广播的发送者,context.sendBroadcast(intent).通过intent包装数据,这里包括putExtra数据,还有setAction添加intent识别标记。广播接受者(BroadcastReceiver)可以是你写的一个内部类,也可以是一个你单独写的类文件。在onReceive()接受发送时传递的intent,处理数据.最最容易忽视的一点:你重写的这个recevier,一定要注册。要不然它不会与广播产生任何关联。你可以通过在mainfest中注册,也可以在代码中注册。不管哪种方式,一定要有!!!

安卓广播api介绍,给自己理清楚概念的更多相关文章

  1. APP自动化框架LazyAndroid使用手册(3)--核心API介绍

    作者:黄书力 概述 在前一篇博文中,简要介绍了一款安卓UI自动化测试框架LazyAndroid (http://blog.csdn.net/kaka1121/article/details/53204 ...

  2. ReactNative入门(安卓)——API(下)

    LayoutAnimation - layout动画 当布局发生改变时的动画模块,它有两个方法: 1. 最常用的方法是 LayoutAnimation.configureNext(conf<Ob ...

  3. 常用ArcGIS for Silverlight 开发API介绍

    1.API介绍 2.Map对象  3.Layer对象 4.Symbol对象 5.Task对象

  4. Servlet基础(一) Servlet简介 关键API介绍及结合源码讲解

    Servlet基础(一) Servlet基础和关键的API介绍 Servlet简介 Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中. Servlet容器负责Servl ...

  5. python学习笔记(win32print API介绍)

    最近博主在研究用python控制打印机 这里整理下win32print的API介绍,官网地址http://timgolden.me.uk/pywin32-docs/win32print.html Op ...

  6. 使用html5中video自定义播放器必备知识点总结以及JS全屏API介绍

    一.video的js知识点: controls(控制器).autoplay(自动播放).loop(循环)==video默认的: 自定义播放器中一些JS中提供的方法和属性的记录: 1.play()控制视 ...

  7. Commons-lang API介绍

    4.1 Commons-lang API介绍 4.1.1 StringUtils 4.1.2 StringEscapeUtils 4.1.3 ArrayUtils 4.1.4 DateUtils 4. ...

  8. Spring Boot 2.x 编写 RESTful API (一) RESTful API 介绍 & RestController

    用Spring Boot编写RESTful API 学习笔记 RESTful API 介绍 REST 是 Representational State Transfer 的缩写 所有的东西都是资源,所 ...

  9. FastDFS api介绍

    1. 命令行api介绍 FastDFS提供了可用于运维测试的命令行api,下面进行介绍: 1.1 fastdfs服务管理 tracker进程服务管理脚本 /etc/init.d/fdfs_tracke ...

随机推荐

  1. 几十万学费总结出来的Ddos攻击防护经验!

    本人从事网络安全行业十余年年.有十年被骗经验.被骗了很多回(都说能防300G,500G,买完就防不住了),本文当然重点给大家说明,ddos攻击是什么,中小企业如何防护,用到成本等. 言归正传 首先我们 ...

  2. 项目脚手架 - 《Spring Boot + MyBatis + MyBatis Generator》

    前言 最近启动了一个新的项目发现,每当一个新项目的启动往往需要从头搭建一个"框架",其中虽然很多基础代码可以Copy,但也会浪费不少时间. 基于这个情况,我打算在GitHub上创建 ...

  3. 国内外主要的PHP开源CMS系统分析

    国内PHP开源CMS内容管理系统从程序框架,模版加载到程序功能上都有很大的进步,大部分都采用了自定义模块,自定义模型的方式,同时提供各个CMS都提供不同的特色功能,CMS内容管理系统一直影响着互联网的 ...

  4. OpenCV-Python 轮廓分层 | 二十五

    目标 这次我们学习轮廓的层次,即轮廓中的父子关系. 理论 在前几篇关于轮廓的文章中,我们已经讨论了与OpenCV提供的轮廓相关的几个函数.但是当我们使用cv.findcontour()函数在图像中找到 ...

  5. 开发一个健壮的npm包

    项目地址:loan-calculate-utils npm包的发布.更新查看上一篇文章 开发一个基础的npm包 目前我们的目录是这个样子: . ├── source 源代码目录 │   └── ind ...

  6. python接口调用把执行结果追加到测试用例中

    python操作excel的三个工具包如下,注意,只能操作.xls,不能操作.xlsx. xlrd: 对excel进行读相关操作 xlwt: 对excel进行写相关操作 xlutils: 对excel ...

  7. (note)从小白到产品经理之路

    学习了云课堂的产品课程,整理出部分笔记,以作备用参考,方便实际运用过程中查看巩固. 1.产品工具:Axure.mindmanager.viso.办公软件wps 2.产品人需要具备的品格 富有同理心,习 ...

  8. 事务框架之声明事务(自动开启,自动提交,自动回滚)Spring AOP 封装

    利用Spring AOP 封装事务类,自己的在方法前begin 事务,完成后提交事务,有异常回滚事务 比起之前的编程式事务,AOP将事务的开启与提交写在了环绕通知里面,回滚写在异常通知里面,找到指定的 ...

  9. iOS 状态栏显示/隐藏

    iOS 10为止,将在plist文件中将 View controller-based status bar appearance 设置为NO,就可以用UIApplication设置状态栏. 注意,要在 ...

  10. Ubuntu虚拟机查看文件,目录颜色详解

    查看文件 查看Home(不是home)目录下文件: [duanyongchun@localhost ~]$ ls 查看根目录下文件: [duanyongchun@localhost ~]$ cd / ...