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

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

香港 E5-2650 16G 10M 900元首月 美国 E5-2660 V2 16G 100M 688元/月 华纳云

华纳云双11钜惠出海:CN2海外物理服务器终身价688元/月,香港/美国机房,免费送20G DDos防御,50M CN2或100M国际带宽可选,(文内附带测评)华纳云作为一家专业的全球数据中心基础服务提供商,总部在香港,拥有香港政府颁发的商业登记证明,APNIC 和 ARIN 会员单位。主营香港服务器、美国服务器、香港/美国OpenStack云服务器、香港高防物理服务器、美国高防服务器、香港高防I...

vpsdime:夏日促销活动,美国达拉斯VPS,2G内存/2核/20gSSD/1T流量,$20/年

vpsdime怎么样?vpsdime是2013年注册的国外VPS主机商,实际上他还有一系列的其他域名站点如Winity.io, Backupsy,Cloudive, Virtora等等,母公司“Nodisto IT”相对来说还是很靠谱了的商家。VPSDime主要提供各种高配低价VPS套餐,其中Linux VPS和存储VPS基于OpenVZ架构,高级VPS基于KVM。VPSDime在上个季度的Low...

ZJI(月付480元),香港阿里云专线服务器

ZJI是成立于2011年原Wordpress圈知名主机商—维翔主机,2018年9月更名为ZJI,主要提供香港、日本、美国独立服务器(自营/数据中心直营)租用及VDS、虚拟主机空间、域名注册业务。本月商家针对香港阿里云线路独立服务器提供月付立减270-400元优惠码,优惠后香港独立服务器(阿里云专线)E3或者E5 CPU,SSD硬盘,最低每月仅480元起。阿里一型CPU:Intel E5-2630L...

android广播大全为你推荐
知识分享平台关于分享职场技能的知识付费平台,大家有什么好推荐的吗?chrome系统谷歌Chrome OS可以用来做什么?数据监测监测局是做什么的?网络审计网经科技1820听说是网络审计路由器,大家知道怎么样吗?设备支持多少用户啊人肉搜索引擎人肉搜索引擎是干什么的?qq网络硬盘如何使用QQ网络硬盘数据统计分析表EXCEL怎么制作百分比数据分析表图腾讯技术腾讯QQ是谁研发的?在那一年上市的?什么是生态系统生态系统的结构是什么文本框透明word文本框的背景图片怎样调透明度
vps是什么意思 t楼 cve-2014-6271 uk2 59.99美元 流媒体服务器 云主机51web tk域名 华为网络硬盘 大容量存储器 200g硬盘 服务器是干什么的 www789 河南移动梦网 photobucket 阿里云邮箱申请 tracker服务器 九零网络 godaddyssl ncp 更多