安卓广播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 ...
随机推荐
- 我的第一个html静态网页
<!doctype html> <html> <head> <title>王兆国的个人博客</title> ...
- spss绘制图形更改组距
在绘制数据分布条形图时,要更改y轴的刻度很简单,直接在图形编辑窗口点击y轴修改就可以了. 而x轴的间隔自动设置为1,如果想要更改组距,可以按照以下方式: 点击重新编码为不同变量 选择要更改的变量,在[ ...
- Building Applications with Force.com and VisualForce(Dev401)(十一):Designing Applications for Multiple Users: Proseving Data Quality
Dev401-012:Proseving Data Quality Universal Containers Scenario1.Universal Containers(UC) wants to e ...
- POS-商户手续费-从生活剖析,通俗易懂
前言 我们大家日常都在使用pos机,尤其是买衣服,吃火锅,都习惯刷卡.pos机带来的消费便利,也正是市场 对经济的一种促进手段. 今天主要分享下商户手续费这个概念,引出这个概念前,我们先大概说点别的东 ...
- 配置centOS下的Python
Linux下Python版本升级: 1. 首先确认Linux操作系统中自带的python 版本时候与自己所需要的版本一致 所有的python版本都在https://www.python.org/ftp ...
- IOS 手动添加第三方库报错问题
当不想使用CocoaPods来管理和使用第三方库的时候,就需要手动添加和配置这些第三方库,难免会出现一些问题,主要问题汇总如下: 1.AFNetworking.NKNetWork.ZxingObjC等 ...
- [tyvj2032]升降梯上<dp&spfa>
题目背景 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升降的巨大手柄. 题目描述 Nescafe 之 ...
- cento升级openssl依旧显示老版本
不久前拿到了一季度的服务器漏洞扫描报告,还是一些老生常谈的软件.按照报告上的漏洞一个个处理,开始升级openssl的时候一切都很顺利,上传源码包,解压,编译,安装,全部都没有报错.opessl --v ...
- C 苟富贵
时间限制 : 15000 MS 空间限制 : 524288 KB 问题描述 你最近买六合彩赚了很多钱,导致一个银行账户存不下了,于是你开设了 N 个账户,第 i 个账户里存有 Ai 元. 你的好友 ...
- Git版本控制 Git、github,gitlab相关操作
目录 关于版本控制 版本管理工具 集中式管理 分布式管理 git版本管理 git介绍 软件安装 Git工作状态 原理流程步骤 git基本操作 对文件进行修改 分支 共享仓库 创建共享仓库: 共享仓库上 ...