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

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

VPS云服务器GT线路,KVM虚vps消息CloudCone美国洛杉矶便宜年付VPS云服务器补货14美元/年

近日CloudCone发布了最新的补货消息,针对此前新年闪购年付便宜VPS云服务器计划方案进行了少量补货,KVM虚拟架构,美国洛杉矶CN2 GT线路,1Gbps带宽,最低3TB流量,仅需14美元/年,有需要国外便宜美国洛杉矶VPS云服务器的朋友可以尝试一下。CloudCone怎么样?CloudCone服务器好不好?CloudCone值不值得购买?CloudCone是一家成立于2017年的美国服务器...

免费注册宝塔面板账户赠送价值3188礼包适合购买抵扣折扣

对于一般的用户来说,我们使用宝塔面板免费版本功能还是足够的,如果我们有需要付费插件和专业版的功能,且需要的插件比较多,实际上且长期使用的话,还是购买付费专业版或者企业版本划算一些。昨天也有在文章中分享年中促销活动。如今我们是否会发现,我们在安装宝塔面板后是必须强制我们登录账户的,否则一直有弹出登录界面,我们还是注册一个账户比较好。反正免费注册宝塔账户还有代金券赠送。 新注册宝塔账户送代金券我们注册...

稳爱云(26元),香港云服务器 1核 1G 10M带宽

稳爱云(www.wenaiyun.com)是创建于2021年的国人IDC商家,主要目前要出售香港VPS、香港独立服务器、美国高防VPS、美国CERA VPS 等目前在售VPS线路有三网CN2、CN2 GIA,该公司旗下产品均采用KVM虚拟化架构。机房采用业内口碑最好香港沙田机房,稳定,好用,数据安全。线路采用三网(电信,联通,移动)回程电信cn2、cn2 gia优质网络,延迟低,速度快。自行封装的...

android广播大全为你推荐
决策树分析决策数法的名词解释csonline2反恐精英online2什么时候出应用雷达雷达在各方面的用途chrome系统Chrome系统怎么进bios扫图扫图要怎么修图assemblyinfoasp.net这几个文件是干什么的?数据统计分析表EXCEL怎么制作百分比数据分析表图数据统计分析表如何用Excel做数据分析?labelforhtml中label是什么意思啊?文本框透明word里文本框怎么透明?
域名注册申请 vps代理 256m内存 godaddy续费优惠码 主机屋免费空间 韩国名字大全 gtt 搜索引擎提交入口 服务器硬件防火墙 web服务器搭建 申请网站 空间登录首页 游戏服务器出租 工信部网站备案查询 卡巴斯基试用版下载 cdn服务 中国电信宽带测速 websitepanel ftp是什么东西 性能测试工具 更多