正确处理Ordered Broadcasts「建议收藏」

正确处理Ordered Broadcasts「建议收藏」
原文:http://aoandroid.com/node/1414
 
 
最近,Android官方开发员博客(DevelopersBlog)登载了Google巴西分布的一名工程师(
BeloHorizonte )的文章,介绍了正确使用Broadcast的概念和实例分析。该文章在概念上纠正了很多开发人员对Broadcast处理中存在的严重问题,并指出这反映了开发文档存在缺陷,没有解释清楚。
Broadcast是Android的一个很有用的概念

大家好,又见面了,我是你们的朋友全栈君。

原文:http://aoandroid.com/node/1414

 

 

最近,Android官方开发员博客(Developers Blog)登载了Google巴西分布的一名工程师(
Belo Horizonte )的文章,介绍了正确使用Broadcast的概念和实例分析。该文章在概念上纠正了很多开发人员对Broadcast处理中存在的严重问题,并指出这反映了开发文档存在缺陷,没有解释清楚。

Broadcast是Android的一个很有用的概念。当系统产生某些事件的时候,apps可以对某些事件(ACTION)注册(register)后,通过BroadcastReceiver捕捉到这些Broadcasts,从而获得一些很重要的系统信息。电池状态就是一个例子,比如,ACTION_BATTERY_LOW。

Belo注意到有些开发人员没有使用正确方法调用BroadcastReveiver。比较有代表性的概念混淆是

Not ordered 相对于 Ordered Broadcasts

在Not-ordered模式,系统的Broadcasts是同时发布出来,所有receiver都可以得到该事件信息,互相并不影响。即,一个receiver不能影响其它receivers是否能获得该事件信息。上面电池的 ACTION_BATTERY_LOW 就是属于not-ordered事件。

在ordered模式
,broadcasts是通过优先设置传达给不同receivers的,优先度在AndroidManifest文件中通过android:priority的intent-filter设置控制的。某个receiver可以通过BroadcastReceiver取消broadcast,取消后,比它优先度底的receivers将不再能得到该broadcast。一个典型的例子是,ACTION_NEW_OUTGOING_CALL。
 
每当用户拨打电话的时候,系统会发布(broadcast)这个 ACTION_NEW_OUTGOING_CALL 的事件。由于这是个ordered broadcast,app的不同receiver可以对它进行必要的控制。Belo给出一段暗含问题的代码
(注意,CallReceiver 必须首先在AndroidManifest里面关联ACTION_NEW_OUTGOING_CALL)

 

 

 

 

 

这段代码试图在获得
ACTION_NEW_OUTGOING_CALL后根据条件,或者拒绝拨打电话,或者让用户修改电话号码。

但是,只有在没有其它具备更高优先度的Receiver的时候,这段代码才会如预期的正确执行。如果有一个更高优先的receiver也关联了ACTION_NEW_OUTGOING_CALL,并且先于这段代码执行了,那么,有可能他们会用一样的原始号码,而没有正确的使用修改后的号码。

正确的做法应该是如下列代码那样:

 

 

 

 

这段代码事先判断了是否有另外receiver可能已经生成了一个拨号号码,没有的话,才调用intent extra的
EXTRA_PHONE_NUMBER。

这个问题有多严重?

Belo声称,很多apps被发现,使用priority 0的NEW_OUTGOING_CALL的receivers,所有这些receivers都如上述第一个代码例子那样忽略了可能的高优先receivers已经先期执行,并同样关联了NEW_OUTGOING_CALL。当然,你也可以把所有关联了NEW_OUTGOING_CALL的receivers都设在priority 0上,但是这又违反了Android拨打电话的代码处理原则,如果不能访问这个链接,可以参考SDK带的文档。

该处理原则是:

‘为了保持一致性,任何意在阻止向外拨打电话的receiver必须设0优先 (priority 0),以确保该receiver获得最后输入的电话号码。任何意在修改拨打号码的receiver应该设正数优先度,即大于零的正数。负数优先度是给系统保留的,任何apps用负数优先度可能引发问题’

Belo的结论是,很多应用软件存在这个问题,呼吁大家抓紧检查,即时解决这类问题,确保Android应用软件的整体质量。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148053.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Discuz 二次开发 (一) 目录结构和运行逻辑

    Discuz 二次开发 (一) 目录结构和运行逻辑Discuz二次开发(一)目录结构和运行逻辑目录结构DISCUZ使用自己的框架,与现在主流的web框架不同,DISCUZ没有路由表,他的路由是由入口文件来实现的。apiuc.phpUCenter通信文件/api/addons应用中心/api/connect通讯互联/api/googleGoogle引擎结构处理/api/javascript数据和广告的js调用/api/manyoumanyou应用及搜索等相关服务/api/remote远程更新/api/tr

    2022年5月19日
    39
  • web网页设计实例作业 我的家乡- 达州(4页) HTML+CSS+JavaScript dreamweaver作业静态HTML网页设计模板

    web网页设计实例作业 我的家乡- 达州(4页) HTML+CSS+JavaScript dreamweaver作业静态HTML网页设计模板HTML5期末大作业:家乡网站设计——我的家乡-达州(4页)HTML+CSS+JavaScriptdreamweaver作业静态HTML网页设计模板常见网页设计作业题材有个人、美食、公司、学校、旅游、电商、宠物、电器、茶叶、家居、酒店、舞蹈、动漫、明星、服装、体育、化妆品、物流、环保、书籍、婚纱、军事、游戏、节日、戒烟、电影、摄影、文化、家乡、鲜花、礼品、汽车、其他等网页设计题目,A+水平作业,可满足大学生网页大作业网页设

    2022年7月19日
    16
  • Python实现排列组合算法

    Python实现排列组合算法实现组合算法C(n,k),可以用递归实现:importcopy#实现list的深复制defcombine(lst,l):result=[]tmp=[0]*llength=len(lst)defnext_num(li=0,ni=0):ifni==l:result.append…

    2022年10月20日
    2
  • java rmi与dubbo

    java rmi与dubbo首先得知道什么是分布式,以及和集群的区别?分布式:一个业务分拆成多个子业务,部署在不同的服务器上,多半是为了业务解耦,不同的业务可以分别部署,互不干扰,只在需要时相互调用,提升效率。集群:同一个业务,部署在多个服务器上,多半是为了解决高并发,高访问量,提高系统性能。RMIRMI(RemoteMethodInvocation)即远程方法调用,是java在JDK1.1中实现的一…

    2022年6月16日
    35
  • 基于matlab的语音信号频谱分析_声音信号的数字化过程

    基于matlab的语音信号频谱分析_声音信号的数字化过程1.概述随着软硬件技术的发展,仪器的智能化与虚拟化已成为未来实验室及研究机构的发展方向[1]。虚拟仪器技术的优势在于可由用户定义自己的专用仪器系统,且功能灵活,很容易构建,所以应用面极为广泛。基于计算机软硬件平台的虚拟仪器可代替传统的测量仪器,如示波器、逻辑分析仪、信号发生器、频谱分析仪等[2]。从发展史看,电子测量仪器经历了由模拟仪器、智能仪器到虚拟仪器,由于计算机性能的飞速发展,已把传

    2022年8月11日
    6
  • sql smallint与int_datetime数据类型

    sql smallint与int_datetime数据类型使用整数数据的精确数字数据类型。bigint数值范围从-2^63(-9223372036854775808)到2^63-1(9223372036854775807)的整型数据(所有数字)。存储大小为8个字节。int数值范围从-2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型数据(所有数字)。存储大小为4个字节。int的SQL-92同义字为integer。smallint数值范围从-2^15(-32,76

    2022年9月21日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号