安卓广播api介绍,给自己理清楚概念
广播接收器类概述
这是用于接收由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介绍,给自己理清楚概念的更多相关文章
- APP自动化框架LazyAndroid使用手册(3)--核心API介绍
作者:黄书力 概述 在前一篇博文中,简要介绍了一款安卓UI自动化测试框架LazyAndroid (http://blog.csdn.net/kaka1121/article/details/53204 ...
- ReactNative入门(安卓)——API(下)
LayoutAnimation - layout动画 当布局发生改变时的动画模块,它有两个方法: 1. 最常用的方法是 LayoutAnimation.configureNext(conf<Ob ...
- 常用ArcGIS for Silverlight 开发API介绍
1.API介绍 2.Map对象 3.Layer对象 4.Symbol对象 5.Task对象
- Servlet基础(一) Servlet简介 关键API介绍及结合源码讲解
Servlet基础(一) Servlet基础和关键的API介绍 Servlet简介 Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中. Servlet容器负责Servl ...
- python学习笔记(win32print API介绍)
最近博主在研究用python控制打印机 这里整理下win32print的API介绍,官网地址http://timgolden.me.uk/pywin32-docs/win32print.html Op ...
- 使用html5中video自定义播放器必备知识点总结以及JS全屏API介绍
一.video的js知识点: controls(控制器).autoplay(自动播放).loop(循环)==video默认的: 自定义播放器中一些JS中提供的方法和属性的记录: 1.play()控制视 ...
- 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. ...
- Spring Boot 2.x 编写 RESTful API (一) RESTful API 介绍 & RestController
用Spring Boot编写RESTful API 学习笔记 RESTful API 介绍 REST 是 Representational State Transfer 的缩写 所有的东西都是资源,所 ...
- FastDFS api介绍
1. 命令行api介绍 FastDFS提供了可用于运维测试的命令行api,下面进行介绍: 1.1 fastdfs服务管理 tracker进程服务管理脚本 /etc/init.d/fdfs_tracke ...
随机推荐
- java web 获取 网页访问次数
ServletContext context = request.getServletContext(); /** * 从ServletContext中获取计数器对象 */Integer count ...
- Magento2-2.3.4 win10安装完magento无法加载静态资源导致无法进入后台登录页面
后台面无法进入,截图如下
- 使用new Image()可以针对单单请求,不要返回数据的情况
使用new Image()可以针对单单请求,不要返回数据的情况,比如我这里写了一个Demo,请求百度的Logo一个示例: <html> <head> </head> ...
- 零售CRM系统开发的核心功能
在零售行业中,客户关系管理系统是一个包含销售,市场营销和客户服务流程的中央枢纽.它为企业所有者提供了一种可以结合所有与销售有关的问题并管理销售流程的有效工具.零售CRM可以留住客户,提供个性化的一流客 ...
- 目标检测 | 经典算法 Cascade R-CNN: Delving into High Quality Object Detection
作者从detector的overfitting at training/quality mismatch at inference问题入手,提出了基于multi-stage的Cascade R-CNN ...
- Cisco 模拟配置
本次模拟:采用Cisco Packet Tracer 软件,进行cisco网络设备的模拟.可以实现CLI界面命令配置,同实际交换机一样. 1.同一VLAN 可以互相访问,不同VLAN 不能访问 PC0 ...
- Python异常处理,将异常写入到一个文件
'''定义一个函数func(urllist) urllist:为URL的列表,例如:['http://xx.com','http://www.xx.com','http://www.xxx.com'. ...
- 简易版cnlog
目录 简易版cnlog html文件 mycess.cess 页面效果 简易版cnlog 注意的点 1.一定先分好块标签,再基于一个个块标签进行装饰(相当于给一个个人化妆) 2.浮动: 我的理解是从一 ...
- 判断网站CMS
1.robots.txt文件 robots.txt文件我们写过爬虫的就知道,这个文件是告诉我们哪些目录是禁止爬取的.但是大部分的时候我们都能通过robots.txt文件来判断出cms的类型 如: 从w ...
- 动态网站项目(Dynamic Web Project)CRUD(增删改查)功能的实现(mvc(五层架构)+jdbc+servlet+tomcat7.0+jdk1.8),前端使用JSP+JSTL+EL组合
代码分享链接 https://pan.baidu.com/s/1UM0grvpttHW9idisiqa6rA 提取码:hx7c 图示 项目结构 1.SelectAllUser ...