广播的注册分为静态注册和动态注册,静态注册在应用安装的时候由PackageManagerService来完成注册。这里只介绍动态注册。

  1. 动态注册
  • 调用registerReceiver方法,它在ContextWrapper中实现,mBase具体指向就是ContextImpl,ContextImpl的registerReceiver方法有很多重载的方法,最终调用registerReceiverInternal方法,它会调用IActivityManager的registerReceiver方法,最终调用AMS的registerReceiver方法。

广播的发送和接收过程分为两个过程来进行,分别是ContextImpl到AMS的调用过程和AMS到BroadcastReceiver的调用过程。

  1. 广播的发送和接收过程

ContextImpl到AMS的调用过程

  • 广播包括多种类型。包括无序广播、有序广播和粘性广播。要发送无序广播需要调用sendBroadcast方法,它在ContextWrapper中实现,给出调用流程:sendBroadcast()(ContextWrapper) -> sendBroadcast(ContextImpl) -> broadcastIntent(IActivityManager) -> broadcastIntent(AMS) -> broadcastIntentLocked(AMS),需要注意AMS中的verifyBroadcastLocked方法,会确认广播的合法性。

AMS到BroadcastReceiver的调用过程

  • BroadcastQueue的scheduleBroadcastLocked方法开始,向BroadcastHandler类型的mHandler对象发送了BROADCAST_INTENT_MSG类型的消息,这个消息会在handleMessage方法中调用了processNextBroadcast方法,它会分别处理无序和有序广播,它通过while循环将消息发送给对应的广播接收者,获取每一个mParallelBroadcasts列表中存储的BroadcastRecord类型的r对象,通过函数deliverToRegisteredReceiverLocked发送给注册者。
  • 它会检查广播发送者和接收者的权限,调用performReceiveLocked方法,在scheduleRegisteredReceiver方法中调用了IIntentReceiver类型的对象,receiver的performReceive方法,这个类型的对象用于跨进程通信。它是Binder通信的客户端,InnerReceiver在本地的代理,具体实现是InnerReceiver。在InnerReceiver的performReceive方法中调用ReceiverDispatcher类型的rd对象的performReceive方法。
  • 它将广播intent等信息封装为Args对象,会通过getRunable方法以及H发送到线程的消息队列中,这个个法会调用BroadcastReceiver类型的receiver对象的onReceive方法,这样就完成了消息的接收。

Android再进阶之广播发送、接收和注册过程相关推荐

  1. android开发蓝牙传输图片,如何发送/接收文本和图片通过蓝牙android到另一个android手机...

    我假设你已经在开发Android的蓝牙应用的经验. Android蓝牙API不直接支持OBEX,意味着我无法将任何文件直接推送到任何设备. Android蓝牙API提供诸如发现,连接和使用流的数据传输 ...

  2. UDP 实现多收多发,广播发送,组播发送 TCP 实现多收多发

    文章目录 TCP 实现多收多发(上线下线提醒) UDP多收多发 UDP广播发送接收 UDP 组播发送接收 TCP 实现多收多发(上线下线提醒) 创建发送端 public static void mai ...

  3. AndroidStudio_HttpServer类接收到数据以后_通过广播给对应Activity发送接收到是远程服务器的数据---Android原生开发工作笔记226

    广播的原理,其实就是消息队列,在android中封装的消息队列服务,消息队列,不受线程之间的影响所以,可以随意收发,很好用. 1.首先去写一个广播接收器. package com.baidu.idl. ...

  4. Android使用BroadCastRecevier广播实现接收短信,并利用Toast弹出显示内容

    在上一篇文章 Android简单实现BroadCastReceiver广播机制 中简单的实现了一个广播机制,这里利用BroadCarstRecevier实现一个接收短信并显示内容的案例,当然至于接收到 ...

  5. Android 第二十课 广播机制(大喇叭)----发送自定义广播(包括发送标准广播和发送有序广播)

    广播分为两种类型:标准广播和有序广播 我们来看一下具体这两者的具体区别: 1.发送标准广播 我们需要先定义一个广播接收器来准备接收此广播才行,否则也是白发. 新建一个MyBroadcastReceiv ...

  6. openfire android 发送图片,基于openfire+smack开发Android即时聊天应用[四]-单人聊天、群聊、发送接收文件等...

    这篇文章主要介绍如何实现点对点单人聊天.多人的群聊.以及如何给对方发送文件,如何发送图片消息和语音消息等功能. 1.单人聊天 1.首先创建聊天对象 /** * 创建聊天窗口 * @param jid ...

  7. 求android 中串口的发送接收数据代码

    RT,求高手帮忙! 就是 /dev/ttyS0 和/dev/ttyS1 两个设备的通信问题.. 同求~ 这个是不是需要串口驱动啊?最近正在搞这个串口通信的案子,头疼 同样也没有搞出来,老是报:不能扫描 ...

  8. Android中 广播发送 和 接受 的简单示例

    AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xm ...

  9. android 广播 event,无法接收android.intent.action.EVENT_REMINDER广播

    我想编写一个在发生日历提醒时触发的应用程序.我意识到没有正式记录的方法,但我在日志中看到,当我的日历闹钟在我的手机(Droid X)上关闭时,AlertReceiver表明它已收到android.in ...

最新文章

  1. pandas使用dt.year(month/day/hour/minute/second)函数抽取dataframe日期数据列对应的年月日时分秒信息
  2. rommon模式下给路由器灌入IOS
  3. seo策略从5方面下手
  4. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 一 | mmap 函数简介 )
  5. 量化交易,量化分析推荐书单
  6. mysql树节点路径,关于mysql:从使用物化路径编码树的表中选择,按深度优先排序(无递归/ ltree)...
  7. Java学习日报 — 问题记录 — 2021/12/14
  8. Python 中的黑暗角落(一):理解 yield 关键字
  9. 消息中间件学习总结(2)——RocketMQ之阿里开源消息中间件RocketMQ的前世今生
  10. java 多线程 最优_Java多线程与并发系列从0到1全部合集,强烈建议收藏!
  11. MySQ学习笔记之十 NULL值处理
  12. 微信浪漫告白小程序java_厉害了,微信小程序可以这样表白,还怕他(她)拒绝你?...
  13. java实现二维码的生成与解析
  14. Arcgis操作系列一:shp矢量数据的面积计算
  15. Excel表格打印时不打印标记填充颜色
  16. 软件测试面试该如何谈薪
  17. uniapp使用canvas画海报二维码
  18. php简单论坛登录注册,php登录注册求救
  19. 金融风控实战——信贷特征衍生与筛选(中国移动人群画像赛TOP1)
  20. 某一个社会舆情事件发展走势和动态要如何分析的方法

热门文章

  1. 后端如何编写API文档给到前端?
  2. Hadoop退出安全模式
  3. C语言实现24点小游戏
  4. 工程建设项目全套流程,门清!
  5. 27U、42U、47U常见机柜设备布局图详解【转载自微信公众号弱电课堂】
  6. 汽车抵质押贷款系统-押品评估、登记、入库、出库、处理等标准化流程管理
  7. 8000 sentences of oral English(four)
  8. Vue刷新组件,页面刷新
  9. vue中的与||符号
  10. 微信小程序WebView嵌入别人网页的解决办法