BroadcastReceiver的源码分析
android提供了广播机制,通过BroadcastReceiver可以在不同的进程间传递消息。类似于观察者模式,A应用通过注册广播表示A对消息subject感兴趣,当B应用发出subject类型的消息的时候,A应用就能收到对应的消息。
android提供静态和动态两种方式进行消息注册,静态注册指的是在AndroidManifest.xml中进行注册,动态注册指的是在Activity通过registerReceiver的方式进行广播注册。
静态广播注册流程
静态广播注册指的是在AndroidManifest.xml注册Receiver,当Apk安装时会将静态注册的Receiver信息注册到PMS中,APK的安装流程(https://www.jianshu.com/p/953475cea991)如下:
其中installPackageLI完成了Apk的解析,生成了Package对象,scanPackageLi包括四大组件注册之类的操作。
解析到APK里的静态广播会注册到PMS的mReceivers对象中,mReceivers类型为ActivityIntentResolver。
动态广播注册流程
Activity通过registerReceiver方式进行广播注册,注册流程如下:
ContextImpl.registerReceiverInternal
该函数根据BroadcastReceiver对象生成IIntentReceiver对象,该对象和ApplicationThread的功能一样,试想一下,APP进程向AMS进程注册广播,当AMS收到广播向APP进程分发时需要用到Binder调用,IIntentReceiver就是进行跨进程调用的。
AMS将IIntentReceiver保存到mReisterdReceivers中,最终保存到mReceiverResolver.addFilter(bf);中。
sendBroadcast发送广播
发送广播最终走到了AMS.broadcastIntentLocked,其中核心的代码如下所示:
broadcastIntentLocked中receivers表示静态注册的广播,通过collectReceiverComponents从PMS那里获取;registerdReceivers表示动态注册的广播,从mReceiverResolver那里获取。在获取到要接受所有广播后,就调用如下函数进行广播分发。
scheduleBroadcastsLocked开始进行广播发送
Handler消息最终调用了BroadcastQueue.processNextBroadcast,然后调用了performReceiveLocked,
processNextBroadcast调用了performReceiverLocked
performReceiverLocked继续调用IItentReceiver.performReceiver,该调用的Binder方式,
最终调用了Args.run
Args.run通过类加载器加载Receiver对象,并最终调用onReceive函数,至此,广播发送完成。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android自定义ProgressBar样式:渐变圆角水平进度条
Android自定义ProgressBar样式:渐变圆角水平进度条 关键是android:progressDrawable的设置,设置一个android:progressDrawable资源,但是android:progressDrawable需要是一个layer-list。 先看运行效果: 实现的xml布局代码文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="10dp"> <ProgressBar style="@style/Widget.AppCompat.ProgressBar.Horizontal" android:layout_w...
- 下一篇
Android插件化开发之动态加载技术学习
Android插件化开发之动态加载技术学习 为什么要插件化开发和动态加载呢?我认为原因有三点: 可以实现解耦 可以解除单个dex函数不能超过65535的限制 可以给apk瘦身,比如说360安全卫士,整个安装包才13.7M,对于一个用户量上亿的app这个大小已经很小了,它里面很多功能都是以插件的形式存在的 主要解决三个问题 如何加载插件apk的资源文件? 如何调用插件apk的方法? 如何加载插件中的activity,并且有生命周期? 第一个问题:如何加载插件apk的资源文件? 对于第一个问题我们假设有这么一个需求:我们有个app想做类似qq换肤的功能,但是这个皮肤文件很大,如果跟宿主app一起打包的话可能会导致apk包很大,希望通过插件的方式,在用户需要换肤的时候去下载各种皮肤插件,来完成换肤的需求。 首先要了解一个类: DexClassLoader DexClassLoader是一个类加载器,可以用来从.jar和.apk文件中加载class。可以用来加载执行没用和应用程序一起安装的那部分代码。 构造函数: DexClassLoader( String dexPath, //被解压的ap...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS关闭SELinux安全模块
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- MySQL8.0.19开启GTID主从同步CentOS8
- Hadoop3单机部署,实现最简伪集群
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,CentOS8安装Elasticsearch6.8.6