广播接收器类概述


这是用于接收由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. 阿里淘宝的S1级别bug,到底是谁的锅?

    3月25日,阿里的淘宝APP在IOS系统上出现BUG: 在打开淘宝APP以后,用户就会收到系统弹窗通知:“您使用的程序是测试/内测版本,将于当地时间2020-03-28到期,到期后将无法使用,请尽快下 ...

  2. mysql数据库表格之间的关系

    外键 昨日内容回顾: 字段类型 约束条件 创建表的完整语法 create table 表名( 字段名 字段类型[(宽度) 约束条件], 字段名 字段类型[(宽度) 约束条件], 字段名 字段类型[(宽 ...

  3. hdu1171kmp果题

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1711/ #include<bits/stdc++.h> using namespace std; t ...

  4. python-文本字符串

    2019-12-05 14:41:36 一.Unicode 编码问题一直都是文本处理的时候的大难题,python2中的编码异常混乱,本章节主要讨论python3中的编码情况. python3 str的 ...

  5. 为什么你的程序配了classpath还是找不到类

    classpath简介 classpath是java程序时拥有的一个系统变量,这个变量可以通过如下方式获取 System.out.println(System.getProperty("ja ...

  6. Windows下用Python你会几种copy文件的方法?

    1. [代码]1. os.system ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import os import temp ...

  7. Building Applications with Force.com and VisualForce (DEV401) (三):Application Essential:Building Your Data Model

    Dev 401-003:Application Essential:Building Your Data Model Object Relationships1.Link two objects- P ...

  8. TensorFlow系列专题(十一):RNN的应用及注意力模型

    磐创智能-专注机器学习深度学习的教程网站 http://panchuang.net/ 磐创AI-智能客服,聊天机器人,推荐系统 http://panchuangai.com/ 目录: 循环神经网络的应 ...

  9. 打造Worktile敏捷开发管理工具的思与惑

    从2019年初,我们团队准备开发一款适合研发团队使用的敏捷开发管理工具,那时候我们也在思考,到底什么样的工具才算是优秀的研发管理工具,研发管理的场景.方法和流派有很多,市面上关于研发管理工具的产品也是 ...

  10. iOS 预渲染加速图像显示

    使用 UITableView 时,发现滚动时的性能还不错,但来回滚动时,第一次显示的图像不如再次显示的图像流畅,出现前会有稍许的停顿感. 于是猜想显示过的图像肯定是被缓存起来了,查了下文档后发现果然如 ...