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种情况的广播事件:静态注册的系统广播事件、静态注册的用户自定义广播事件、动态注册的系统广播事件和动态注册的用户自定义广播事件。

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

Virtono:€23.7/年,KVM-2GB/25GB/2TB/洛杉矶&达拉斯&纽约&罗马尼亚等

Virtono最近推出了夏季促销活动,为月付、季付、半年付等提供9折优惠码,年付已直接5折,而且下单后在LET回复订单号还能获得双倍内存,不限制付款周期。这是一家成立于2014年的国外VPS主机商,提供VPS和服务器租用等产品,商家支持PayPal、信用卡、支付宝等国内外付款方式,可选数据中心包括罗马尼亚、美国洛杉矶、达拉斯、迈阿密、英国和德国等。下面列出几款VPS主机配置信息,请留意,下列配置中...

酷番云78元台湾精品CN2 2核 1G 60G SSD硬盘

酷番云怎么样?酷番云就不讲太多了,介绍过很多次,老牌商家完事,最近有不少小伙伴,一直问我台湾VPS,比较难找好的商家,台湾VPS本来就比较少,也介绍了不少商家,线路都不是很好,有些需求支持Windows是比较少的,这里我们就给大家测评下 酷番云的台湾VPS,支持多个版本Linux和Windows操作系统,提供了CN2线路,并且还是原生IP,更惊喜的是提供的是无限流量。有需求的可以试试。可以看到回程...

飞讯云E5-2678V3 64GB,湖北十堰100G高防物理机330元/月

飞讯云官网“飞讯云”是湖北飞讯网络有限公司旗下的云计算服务品牌,专注为个人开发者用户、中小型、大型企业用户提供一站式核心网络云端部署服务,促使用户云端部署化简为零,轻松快捷运用云计算。飞讯云是国内为数不多具有ISP/IDC双资质的专业云计算服务商,同时持有系统软件著作权证书、CNNIC地址分配联盟成员证书,通过了ISO27001信息安全管理体系国际认证、ISO9001质量保证体系国际认证。 《中华...

android广播大全为你推荐
qq代挂代挂qq之后自己就上不去了tdetde在国际贸易中的用词代表什么意思orphanremoval我的电脑开机时自检,出现许多这样的字样:Deleting orphan file record segment XXXX (XXXX代表数字)。12种颜色油画的基本12种颜色是什么鄂n鄂N的车牌是那里的?asp大马一句话木马中的大马和小马的作用各是什么?单元测试规范如何写线程池的单元测试上传图片网站求一个可以上传图片外链的网站网络备份怎样手动备份宽带帐号密码点心os现有的基于安卓深度优化的MUUI、点心OS、CM7、乐众ROM、乐蛙,这些哪个好?各自特点?给个排名。
青岛虚拟主机 域名信息查询 net主机 5折 hkbn 国外服务器网站 天猫双十一抢红包 嘟牛 网通ip 福建天翼加速 坐公交投2700元 卡巴斯基官方免费版 刀片服务器的优势 工作站服务器 爱奇艺vip免费试用7天 流媒体加速 空间登入 丽萨 美国凤凰城 dnspod 更多