正确处理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)
上一篇 2022年6月29日 下午3:36
下一篇 2022年6月29日 下午3:46


相关推荐

  • 解释mss的定义_sas读取数据按行读取

    解释mss的定义_sas读取数据按行读取MSEloss1.定义 均方差loss 计算公式如下loss=1/M∑0m(y−x)2loss=1/M\sum_{0}^m{(y-x)^2}loss=1/M0∑m​(y−x)2importtorchimporttorch.nnasnnfromtorch.autogradimportVariableinputs=Variable(torch.ten…

    2025年11月24日
    7
  • 科大讯飞发布星火X1.5深度推理大模型

    科大讯飞发布星火X1.5深度推理大模型

    2026年3月14日
    2
  • 如何生成“年月日_时分秒”命名的文件

    如何生成“年月日_时分秒”命名的文件

    2021年9月1日
    90
  • Linux 中shell 脚本if判断多个条件

    Linux 中shell 脚本if判断多个条件Linux中shell脚本if判断多个条件格式如下,在比较时,数字和字符串用不同的比较符号 1.如果a>b且a<c   if((a>b))&&((a<c))     或者   if[[$a>$b]]&&[[$a<$c]]    或者         if[$a-gt…

    2022年7月27日
    7
  • pycharm安装包说pip版本不对_django库

    pycharm安装包说pip版本不对_django库一、pycharm安装库与pip安装库的区别项目使用哪个解释器,就用哪个解释器下的库:python安装目录解释器就用该目录下的库,项目的解释器就用项目里面的库!而pip安装的库是保存在python安装目录解释器下的。“pip成功,pycharm识别不了”,这就是因为新建项目默认解释器是用“项目的解释器”的,但是pip安装的第三方库是在python安装目录下,所以会识别不了。这里我只把我需要知道的摘下来,具体友情链接:关于pip安装第三方库,但PyCharm中却无法识别的问题;以及PyCharm安装第三

    2022年8月26日
    7
  • ANSI编码对照表「建议收藏」

    ANSI编码对照表「建议收藏」目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码(AmericanStandardCodeforInformationInterchange,美国标准信息交换码),它已被国际标准化组织(ISO)定为国际标准,称为ISO646标准。适用于所有拉丁文字字母,ASCII码有7位码和8位码两种形式。因为1位二进制数可以表示(21=)2种状态:0、1;而2位二进制数可以表示(22)=4种状态:00、01、10、11;依次类推,7位二进制数可以表示(27=)128种

    2026年2月22日
    8

发表回复

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

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