正确处理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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • DropDownList绑定ArrayList「建议收藏」

    DropDownList绑定ArrayList「建议收藏」namespaceCDR.components{publicenumAgentLevel{K,A,B,C}publicclassAgent{publicAgentLevelLevel{get{return_level;}}publicstringName{get{return_name;}}priv…

    2022年10月8日
    1
  • 30个Python小游戏,上班摸鱼我能玩一天【内附源码】

    30个Python小游戏,上班摸鱼我能玩一天【内附源码】一、接金币(1分)普通难度:❤玩法介绍:吃金币,控制左右键,有手就行。源码分享importosimportcfgimportsysimportpygameimportrandomfrommodulesimport*”’游戏初始化”’definitGame():#初始化pygame,设置展示窗口pygame.init()screen=pygame.display.set_mode(cfg.SCREE…

    2022年6月7日
    54
  • Win7系统解决无法打开任务管理器「建议收藏」

    Win7系统解决无法打开任务管理器「建议收藏」Win7系统解决无法打开任务管理器有时候在使用Win7系统过程中会出现无法打开任务管理器的情况,以下内容给出几种常见的打开任务管理器的方式以及无法启动任务管理器时的简单解决方案。Win7系统解决无法打开任务管理器常用打开任务管理器的方式一、快捷键方式二、命令行方式解决方案常用打开任务管理器的方式一、快捷键方式Ctrl+Alt+DelCtrl…

    2022年6月22日
    28
  • 金三银四,教你编写一份脱颖而出的简历,从而 offer 手到擒来,要参加校招的同学要提前准备了「建议收藏」

    金三银四,教你编写一份脱颖而出的简历,从而 offer 手到擒来,要参加校招的同学要提前准备了「建议收藏」最近一段时间不是金三银四嘛,有不少同学通过CSDN私信的方式把简历发给我,要我给出一些建议。看多了以后,我发现,有些同学根本不知道怎么写简历,格式乱七八糟,填写的个人经历就像是记流水账一样,完全勾不起我的任何兴趣。那,招聘方应该比我更苛刻,所以这样的简历投递出去,石沉大海的几率很大啊。2014年,我从苏州回到了洛阳,那是我最后一次投简历,现在还在招聘网站上挂着——公开的。嗯,在这么多年的时间里,并没有招聘方和猎头通过这份挂出去的简历给我打电话,虽然我的联系方式一直没变。那只能说明一点,我当时写的简历

    2022年5月2日
    35
  • webpack基本配置项_webpack配置文件详解

    webpack基本配置项_webpack配置文件详解前言上篇我们已经配置好了本地开发服务器,但是配置的相对比较凌乱,一个文件中有些是开发时用到的配置,有些是生成时用到的配置,有些是开发和生成都要用到的配置,所以我们这里把环境分为3个环境webpac

    2022年8月7日
    10
  • 模拟城市完美布局平面图_css四大布局

    模拟城市完美布局平面图_css四大布局我们之前已经学过一些布局模型,比如说浮动,绝对定位等等,但是这些布局方式一是不够简洁,而是使用的范围确实是太窄了。flex模型拥有比较多的属性,来设置多样的布局方式,接下来我们就详细介绍各种属性对布局的改变,最后再对属性做一个汇总先看一下flex的基本模型,如下图所示:container父容器里有三个子元素flex-item。当给父容器设置display:flex;直接子元素就有布…

    2025年6月15日
    2

发表回复

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

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