本文主要是介绍Android Broadcast原理分析之registerReceiver(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- BroadcastReceiver概述
- BroadcastReceiver分类
- registerReceiver流程图
- 源码解析
- 总结
1. BroadcastReceiver概述
广播作为四大组件之一,在平时开发过程中会大量使用到,使用方式也是多种多样的,既可以自己在manifest中注册,也可以在java代码中动态注册,既可以接收由系统发出的广播,也可以接受自己定义并发送的广播。广播可以实现进程内以及跨进程之间的通信。从本文开始将分别介绍广播的注册,广播的派发,本地广播(LocalBroadcast)以及Android O上对广播的限制,本文主要介绍广播动态注册。
2. BroadcastReceiver分类
从注册方式上区分:动态注册以及静态注册(显示广播和隐式广播)
从发送方式上区分:无序广播和有序广播
从处理类型上区分:前台广播和后台广播
从运行方式上区分:普通广播和Sticky广播(已弃用)
从发送者区分:系统广播和自定义广播
此外还有protect broadcast(只允许指定应用可以发送)
sticky广播:系统保存了一部分广播的状态,当你注册的时候,不需要等到下次这个广播发出来,直接把最近上一次发送的这个广播返回给你
以上的这些概念在接下来的介绍中都会逐个涉及。
3. registerReceiver流程图
其中的APP,ContextImpl,LoadedApk,ActivityManagerProxy都在APP本身的进程中,ActivityManagerService在system_server进程中。
- 首先在APP的进程中发起广播的注册,通过registerReceiver接口,这个方法有很多重载方法,但是最终的入口都是在ContextImpl中,后面会详细介绍
- 从之前的Context的学习可以知道,registerReceiver最终调用的实现在ContextImpl
- 如果没有指定处理广播的handler,则默认使用主线程的handler
- 获取要注册的ReceiverDispatcher,在注册的Context相同的情况下,每个Receiver对应一个ReceiverDispatcher
- 通过binder call到systemserver进行广播注册
4. 源码解析
4.1 ContextImpl.registerReceiverInternal
private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId,IntentFilter filter, String broadcastPermission,Handler scheduler, Context context, int flags) {IIntentReceiver rd = null;if (receiver != null) {if (mPackageInfo != null && context != null) {if (scheduler == null) {// 注册receiver的时候可以指定接受recover的Handler// 如果没有指定,则默认用主线程的handler处理scheduler = mMainThread.getHandler();}// 获取IIntentReceiver// 这个是一个Binder对象,当广播来临时,用于AMS向客户端发起回调rd = mPackageInfo.getReceiverDispatcher(receiver, context, scheduler,mMainThread.getInstrumentation(), true);} else {if (scheduler == null) {scheduler = mMainThread.getHandler();}rd = new LoadedApk.ReceiverDispatcher(receiver, context, scheduler, null, true).getIIntentReceiver();}}try {// binder call至AMS,进行广播注册final Intent intent = ActivityManager.getService().registerReceiver(mMainThread.getApplicationThread(), mBasePackageName, rd, filter,broadcastPermission,
这篇关于Android Broadcast原理分析之registerReceiver(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!