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

网友投稿 742 2022-11-17

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

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。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:K8S pod的生命周期
下一篇:谈到云原生, 绕不开"容器化"
相关文章

 发表评论

暂时没有评论,来抢沙发吧~