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

android广播大全  时间:2021-06-01  阅读:()

android如何区分多个不同的广播?

在注册广播的时候需要声明一个IntentFilter,在IntentFilter里面有一个setAction(String flag)。

?String?flag=&.test.test.Mainactivity"; ?Intent?intent?=?new?Intent();??//Itent就是我们要发送的内容 ?intent.putExtra("data",?"this?is?data?from?broadcast?"+Calendar.getInstance().get(Calendar.SECOND));?? ?intent.setAction(flag);???//设置你这个广播的action,只有和这个action一样的接受者才能接受者才能接收广播 ?sendBroadcast(intent);???//发送广播接收的时候在onReceive里面 String?action?=?intent.getAction(); if(action.equals(&.test.test.Mainactivity")){ ????//你想要实现的代码 }注意的是不同的广播使用不同的falg

android 开机后 发送的广播有哪些

现在有应用A和应用B,我需要在A应用中启动B应用中的某个Activity 实现:A应用中的Activity发送广播,关键代码如下: String broadcastIntent = .example.android.notepad.NotesList";//自己自定义 Intent intent = new Intent(broadcastIntent); this.sendBroadcast(intent); B应用中需要一个BroadcastReceiver来接收广播,取名TestReceiver继承BroadcastReceiver重写onReceive方法启动一个activity,关键代码如下: if(intent.getAction().equals(.example.android.notepad.NotesList")){ Intent noteList = new Intent(context,NotesList.class); noteList.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(noteList); } 到这代码就完成了,当然在AndroidManifest.xml中要对TestReceiver进行注册,代码如下: 这样就完成了通过广播启动另一个应用Activity。

注意问题:Context中有一个startActivity方法,Activity继承自Context,重载了startActivity方法。

如果使用 Activity的startActivity方法,不会有任何限制,而如果使用Context的startActivity方法的话,就需要开启一个新的task,解决办法是,加一个flag,也就是这句noteList.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);的作用。

如果不添加这句,就会报android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity,Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? 分类: Android

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

普通广播:通过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属性的话,先注册的将先收到广播。

android中怎么发送带内容的有序广播

同一优先级的广播接收器,动态的要比静态注册的早。

动态注册:即由代码注册的广播接收器静态注册:即在 androidmanifest.xml 中注册的广播接收器 优先级: 当广播为有序发送的时候,要按这个排序并顺序发送。

sendbroadcast 发送的是无序广播。

sendorderedbroadcast 发送的是有序广播。

好了,现在寻找问题原因,在找原因前肯定有这样的想法,一个有序队列,既然允许有相同的优先级存在,那么在同优先级内要不然有排序子因素,要不基就是按照某种操作可能影响顺序。

后者可能性很大。

打开源码,顺着 动态注册广播接受器 找,最后是 activitymanagerservice.java 这个文件找到了 registerreceiver 的实现。

同地也看到,存储的广播接收器列表是 hashmap mregisteredreceivers 这个变理。

里面有一段代码为: receiverlist rl = (receiverlist)mregisteredreceivers.get(receiver.asbinder()); if (rl == null) { rl = new receiverlist(this, callerapp, binder.getcallingpid(), binder.getcallinguid(), receiver); if (rl.app != null) { rl.app.receivers.add(rl); } else { try { receiver.asbinder().linktodeath(rl, 0); } catch (remoteexception e) { return sticky; } rl.linkedtodeath = true; } mregisteredreceivers.put(receiver.asbinder(), rl); } 在里面查找有没有这个 receiver , 如果没有 put 进去。

看到这里貌似没有对广播的顺序做处理。

是不是有别的地方做排序呢,找找成员变理,发现一个可疑的变量:final arraylist morderedbroadcasts没错,感觉就应该是它了。

找找对它的操作,只有一处 morderedbroadcasts.set ,把代码摘录一下: broadcastrecord r = new broadcastrecord(intent, callerapp, callerpackage, callingpid, callinguid, requiredpermission, sticky, false); morderedbroadcasts.set(i, r);在这里放入了一个 broadcastrecord 对像,而这个对像中主要的东西其实是 receivers向上跟踪 int nt = receivers != null ? receivers.size() : 0; int it = 0; resolveinfo curt = null; broadcastfilter curr = null; while (it < nt && ir < nr) { if (curt == null) { curt = (resolveinfo)receivers.get(it); } if (curr == null) { curr = registeredreceivers.get(ir); } if (curr.getpriority() >= curt.priority) { // insert this broadcast record into the final list. receivers.add(it, curr); ir++; curr = null; it++; nt++; } else { // skip to the next resolveinfo in the final list. it++; curt = null; } } 发现了一段 对 receivers 排序的代码,并且判断也是 priority 的值,用的是 >= 方式 感觉的找到了地方,但是对 activity manager service 这个模块却更加的不懂了,以后有机会一定要分析一下这块是怎样设计的,才能确定本文的问题所在。

暂时记录,以后分析!

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

两类BroadcastReceiver 1、正常广播 Normal broadcasts (用Context.sendBroadcast()发送)是完全异步的。

它们都运行在一个未定义的顺序,通常是在同一时间。

这样会更有效,但意味着receiver不能包含所要使用的结果或中止的API。

2、有序广播 Ordered broadcasts (用 Context.sendOrderedBroadcast()发送)每次被发送到一个receiver。

所谓有序,就是每个receiver执行后可以传播到下一个receiver,也可以完全中止传播??不传播给其他receiver。

而receiver运行的顺序可以通过matched intent-filter 里面的android:priority来控制,当priority优先级相同的时候,Receiver以任意的顺序运行。

PS: 下面举例说明了4种情况的广播事件:静态注册的系统广播事件、静态注册的用户自定义广播事件、动态注册的系统广播事件和动态注册的用户自定义广播事件。

如果您对答案满意,请关注一下名字中的微博,谢谢

易探云香港云服务器价格多少钱1个月/1年?

易探云怎么样?易探云是目前国内少数优质的香港云服务器服务商家,目前推出多个香港机房的香港云服务器,有新界、九龙、沙田、葵湾等机房,还提供CN2、BGP及CN2三网直连香港云服务器。近年来,许多企业外贸出海会选择香港云服务器来部署自己的外贸网站,使得越来越多的用户会选择易探云作为网站服务提供平台。今天,云服务器网(yuntue.com)小编来谈谈易探云和易探云服务器怎么样?具体香港云服务器多少钱1个...

CUBECLOUD:香港服务器、洛杉矶服务器、全场88折,69元/月

CUBECLOUD(魔方云)成立于2016年,亚太互联网络信息中心(APNIC)会员,全线产品均为完全自营,专业数据灾备冗余,全部产品均为SSD阵列,精品网络CN2(GIA) CU(10099VIP)接入,与当今主流云计算解决方案保持同步,为企业以及开发者用户实现灵活弹性自动化的基础设施。【夏日特促】全场产品88折优惠码:Summer_2021时间:2021年8月1日 — 2021年8月8日香港C...

RAKsmart美国VPS上市,活动期间5折抢购仅$30,$1.99/月

RAKsmart机房将于7月1日~7月31日推出“年中大促”活动,多重惊喜供您选择;爆款I3-2120仅30美金秒杀、V4新品上市,活动期间5折抢购、爆款产品持续热卖、洛杉矶+硅谷+香港+日本站群恢复销售、G口不限流量产品超低价热卖。美国VPS、日本VPS及香港VPS享全场7折优惠;爆款VPS $ 1.99/月限量秒杀,10台/天,售完即止, VPS 7折优惠码:VPS-TP-disRAKsmar...

android广播大全为你推荐
avb医学avb是什么意思请求超时DNS请求超时,怎么办?病历单我想请两天病假,病例单怎么写宝应中学宝应初级中学有哪些cpu监控CPU检测软件有哪些 5款CPU检测工具介绍 (webproxy无法连接Internet是什么原因人肉搜索引擎人肉搜索引擎是干什么的?扫图扫图要怎么修图国产操作系统下载国产操作系统要钱吗模式识别算法研究生研究方向:数据挖掘、模式识别、启发算法这三者哪个有前途
免费域名解析 联通c套餐 awardspace kddi 火车票抢票攻略 毫秒英文 腾讯云分析 hostloc isp服务商 免费phpmysql空间 国外ip加速器 吉林铁通 根服务器 免费外链相册 dnspod 石家庄服务器托管 畅行云 atom处理器 创速 云销售系统 更多