Android 开发艺术探索笔记(19)

BroadcastReceiver的工作过程
这里了解广播的注册删除过程还有发送接收过程。
广播的注册过程
广播注册分为静态注册和动态注册,静态注册在应用安装后系统自动完成注册,具体来说是由PMS(PackageManagerService)来完成整个注册过程。
而动态注册的过程是从ContextWrapper的registerReceiver开始的,和Activity、Service一样,ContextWrapper没有实际的工作,而是将注册交给了ContextImpl完成。ContextImpl调用了自己的registerReceiverInternal方法。在这个方法里面,先从mPackageInfo中获取IIntentReceiver对象,然后采用IPC方式向AMS发送广播注册请求。(因为BroadcastReceiver不能够跨进程,所以只能用IIntentReceiver)。而IIntentReceiver封装了广播的接收方法,所以接收到广播时,会调用到onReceive。所以真正的注册方法是在AMS中。
这里写图片描述
这里写图片描述
最终会把远程的InnerReceiver对象和IntentFilter存储起来,整个注册过程就完成了。
广播的接收和发送过程
跟注册过程一样,ContextWrapper也是一个桥接模式,它将发送过程丢给了ContextImpl,,然后ContextImpl又向AMS发送了一个异步请求用于发送广播,AMS用broadcastIntent处理,里面调用了broadcastIntentLocked,这个方法里,首先广播不会对已停止的应用发送广播;其次会根据intent-filter查找出匹配的广播接收者并经过一系列的条件过滤,最终会将满足的广播接收在添加到BroadcastQueue中,接着BroadcastQueue就会将广播发送给相应的接收者。最后在InnerReceiver的onReceive中接收广播。

ContentProvider的工作过程
ContentProvider的onCreate要先于Application的onCreate,这里是启动过程:
这里写图片描述
启动完以后,外界就可以调用它的CRUD接口。这四个方法都是调用Binder来完成,外界无法直接访问ContentProvider。它只能通过AMS根据Uri来获取相应的ContentProvider的Binder接口IContentProvider,然后访问它。
这里写图片描述

Android的消息机制

消息机制主要是Handler,Handler的运行需要底层的MessageQueue和Looper支撑。
MessageQueue是消息队列,内部存储了消息的信息。但它的内部并不是真正的队列,而是单链表的数据结构存储消息信息。
Looper是处理queue的循环。Looper以无限循环的形式去访问MessageQueue,如果有消息就处理,如果没有就等待。Looper中还有一个概念就是ThreadLocal,它并不是线程,它的作用是在每个线程中存储数据。Handler创建的时候会采用当前线程的Looper来构造消息循环系统,而Handler的内部如何来获取当前线程的Looper呢?那就是通过ThreadLoacl了。ThreadLocal可以在不同的线程中互不干扰的提供数据,通过ThreadLocal可以轻松获取每一个线程的Looper。所以要使用Hanlder就必须要先为线程创建Looper。我们常用的主线程ActivityThread,它在创建时会初始化Looper,所以在主线程中默认可用Handler。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值