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

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

pacificrack7月美国便宜支持win VPS,$19.99/年,2G内存/1核/50gSSD/1T流量

pacificrack发布了7月最新vps优惠,新款促销便宜vps采用的是魔方管理,也就是PR-M系列。提一下有意思的是这次支持Windows server 2003、2008R2、2012R2、2016、2019、Windows 7、Windows 10,当然啦,常规Linux系统是必不可少的!1Gbps带宽、KVM虚拟、纯SSD raid10、自家QN机房洛杉矶数据中心...支持PayPal、...

瓜云互联:全场9折优惠,香港CN2、洛杉矶GIA高防vps套餐,充值最高返300元

瓜云互联怎么样?瓜云互联之前商家使用的面板为WHMCS,目前商家已经正式更换到了魔方云的面板,瓜云互联商家主要提供中国香港和美国洛杉矶机房的套餐,香港采用CN2线路直连大陆,洛杉矶为高防vps套餐,三网回程CN2 GIA,提供超高的DDOS防御,瓜云互联商家承诺打死退款,目前商家提供了一个全场9折和充值的促销,有需要的朋友可以看看。点击进入:瓜云互联官方网站瓜云互联促销优惠:9折优惠码:联系在线客...

HoRain Cloud:国内特价物理机服务器,镇江机房,内地5线BGP接入,月付499元起

horain怎么样?horain cloud是一家2019年成立的国人主机商家,隶属于北京辰帆科技有限公司,horain持有增值电信业务经营许可证(B1-20203595),与中国电信天翼云、腾讯云、华为云、UCloud、AWS等签署渠道合作协议,主要提企业和个人提供云服务器,目前商家推出了几款特价物理机,都是在内地,性价比不错,其中有目前性能比较强悍的AMD+NVMe系列。点击进入:horain...

android广播大全为你推荐
在线识别图片来源这张图片怎么区分来自网络还是真实的啊Honeypotfeedback 歌词翻译svn服务器搭建怎样搭建本地svn服务器环境企业资源管理系统企业内部管理系统有哪些数据监测什么是媒体监测?华为总裁女儿为啥姓孟孟晚舟是谁华为总裁女儿为啥姓孟孟晚舟姓孟,任正非姓任,孟晚舟怎么是任正非的女?vga接口定义电脑显示屏VGA是什么意思模式识别算法算法是编程么?考研学模式识别方向,编程多么?qq网络硬盘我QQ的网络硬盘怎么啦?
独立ip虚拟主机 韩国服务器租用 国外免费vps smartvps 阿里云邮箱登陆首页 ion blackfriday linkcloud 20g硬盘 sub-process 免费名片模板 evssl证书 国外php空间 日本空间 免费ftp站点 申请个人网站 泉州电信 网站卫士 服务器合租 万网空间管理 更多