首页 > 其他分享 >android有序广播和无序广播的区别

android有序广播和无序广播的区别

时间:2023-04-30 11:07:51浏览次数:44  
标签:接收器 receiver 无序 广播 Receiver android BroadcastReceiver


BroadcastReceiver 所对应的广播分两类: 普通广播 和 有序广播 。



普通广播 通过 Context.sendBroadcast() 方法来发送。它是完全异步的。



所有的receivers接收器的执行顺序不确定。    因此,所有的receivers接收器接收broadcast的顺序不确定。



这种方式效率更高。但是BroadcastReceiver 无法使用 setResult系列 , getResult系列 及 abort系列API



有序广播 是通过 Context.sendOrderedBroadcast 来发送。所有的receiver依次执行。



BroadcastReceiver可以使用setResult系列函数来结果传给下一个BroadcastReceiver,通过getResult系列函数来取得上个BroadcastReceiver返回的结果,并可以abort系列函数来让系统丢弃该广播让,使用该广播不再传送到别的BroadcastReceiver。



可以通过在 intent-filter 中设置 android:priority 属性来设置receiver的优先级。优先级相同的receiver其执行顺序不确定。



如果BroadcastReceiver是代码中注册的话,且其intent-filter 拥有相同 android:priority 属性 的话,先注册的将先收到广播。

有序广播,即从优先级别最高的广播接收器开始接收,接收完了如果没有丢弃,就下传给下一个次高优先级别的广播接收器进行处理,依次类推,直到最后。

这里接收短信的广播是有序广播,因此可以设置你自己的广播接收器的级别高于系统原来的级别,就可以拦截短信,并且不存收件箱,也不会有来信提示音。

实现方法是:




<</span>receiver android:name=".SmsReceiver" >
<</span>intent-filter android:priority="100">
<</span>action android:name="android.provider.Telephony.SMS_RECEIVED" />                    
</</span>intent-filter>
</</span>receiver>




里面的android:priority="100"就是设定广播接收器的级别,这个值从1000~-1000,数值越大,优先级别就越高。


普通广播(Normal Broadcast):

一,优缺点:和有序广播的优缺点相反!

二,发送广播的方法:sendBroadcast()


有序广播(Ordered Broadcast):

一,优缺点

优点:1,按优先级的不同,优先Receiver可对数据进行处理,并传给下一个Receiver

           2,通过abortBroadcast可终止广播的传播  

缺点:效率低  

二,发送广播的方法:sendOrderedBroadcast()   

三,优先接收到Broadcast的Receiver可通过setResultExtras(Bundle)方法将处理结果存入Broadcast中,

下一个Receiver 通过 Bundle bundle=getResultExtras(true)方法获取上一个 Receiver传来的数据     


程序效果:点击按钮,两个Receiver接收同一条广播,在logcat中打印出数据(按照Receiver的优先顺序,Receiver2先,Receiver1后)      

Manifest




标签:接收器,receiver,无序,广播,Receiver,android,BroadcastReceiver
From: https://blog.51cto.com/u_548275/6237777

相关文章

  • Android 检测是否有ROOT权限
    android(linux)很多命令需要root权限才能执行,比如说查看系统目录文件等,如果我们的程序需要用到查看此类文件或执行系统命令,就必须先获取Root权限。1.importjava.io.DataInputStream;2.importjava.io.DataOutputStream;3.importjava.io.InputStream;4.impor......
  • Android手机信息
    获取手机屏幕高度  1.privatevoidgetWeithAndHeight(){2.//这种方式在service中无法使用,3.DisplayMetricsdm=newDisplayMetrics();4.getWindowManager().getDefaultDisplay().getMetrics(dm);5.Stringw......
  • android平台下UITesting环境配置
    1.androidsdk至少需要android4.1,所以先通过SDKmanager更新sdk,我这里使用android4.22.eclipse至少需要3.6.2,否则不支持3.配置环境变量path,加入java,androidsdktool的路径4.通过AVDManager启动android4.2的虚拟机5.在虚拟机上安装需要测试的apk软件(下面的测试用例只测......
  • 获得android手机的CPU核心数
    //CPU个数privateintgetNumCores(){//PrivateClasstodisplayonlyCPUdevicesinthedirectorylistingclassCpuFilterimplementsFileFilter{@Overridepublicbooleanaccept(Filepathname){//Checkiffilenameis&......
  • Android中使用log4j
    如果要直接在android工程中使用log4j,是有点问题的,会报如下的错: 11-2309:44:56.947:D/dalvikvm(1585):GC_FOR_MALLOCfreed3278objects/311568bytesin31ms rejectingopcode0x21at0x000a rejectedLorg/apache/log4j/config/PropertySetter;.getPropertyDescript......
  • Android ListView 去除…
    去除ListView滑到顶部和底部时边缘的黑色阴影:android:fadingEdge="none"----------------------------------------------------去除拖动时默认的黑色背景:android:cacheColorHint="#00000000" 或listView.setCacheColorHint(Color.TRANSPARENT);---------------------......
  • android上传图片至服务器
    本实例实现了android上传手机图片至服务器,服务器进行保存服务器servlet代码publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Stringtemp=request.getSession().getServle......
  • Android 开发 UI 规则
    Android的官方开发者博客发了一份幻灯片,介绍了一些AndroidUI设计的小贴士,在这里以看图说话的形式发出来。Don’t: 1、不要照搬你在其它平台的UI设计,应该让用户感觉是在真正使用一个Android软件,在你的商标显示和平台整体观感之间做好平衡2、不要过度使用模态对话框3、......
  • Android应用程序的国际化与本地化
    internationalization(国际化)简称i18n,因为在i和n之间还有18个字符,localization(本地化),简称L10n。 zh_CN,zh_TW. http://www.loc.gov/standards/iso639-2/php/code_list.phphttp://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html在Andro......
  • android中的像素单位dp、px、pt、s…
    pixels(设备独立像素).不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA推荐使用这个,不依赖像素。px:pixels(像素).不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。pt:point,是一个标准的长度单位,1pt=1/72英寸,用于......