企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
**ContentResolver.java::registerContentObserver** ~~~ public final void registerContentObserver(Uri uri, booleannotifyForDescendents,ContentObserver observer){ /* 注意registerContentObserver传递的参数,其中: uri是客户端设置的它所需要监听的数据项的地址,用Uri来表示 notifyForDescendents:如果该值为true,则所有地址包含此uri的数据项发生变化时 都会触发通知。否则只有完全符合该uri地址的数据项发生变化时才会触发通知。以文件夹和 其中的文件为例,若uri指向某文件夹,则需设置notifyForDescendents为true。即该文件 夹下的任何文件发生变化,都需要通知监听者。 observer是客户端设置的监听对象。当数据项发生变化时,该对象的onChange函数将被调用 */ try { /* 调用ContentService的registerContentObserver函数,其第三个参数是 observer.getContentObserver的返回值,它是什么呢? */ getContentService().registerContentObserver(uri, notifyForDescendents, observer.getContentObserver()); } ...... } ~~~ registerContentObserver最终将调用ContentService的registerContentObserver函数,其中第三个参数是ContentObservergetContentObserver的返回值。这个返回值是什么呢?需请出ContentObserver家族成员。 1. ContentObserver介绍 ContentObserver家族成员如图8-1所示。 :-: ![](http://img.blog.csdn.net/20150803131336055?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 图8-1 ContentObserver家族类图 图8-1中的ContentObserver类和第7章中介绍的ContentProvider类非常类似,内部都定义了一个Transport类参与Binder通信。由图8-1可知,Transport类从IContentObserver.stub派生。从Binder通信角度来看,客户端进程中的Transport将是Bn端。如此,通过registerContentObserver传递到ContentService所在进程的就是Bp端。IContentObserverBp端对象的真实类型是IContentObserver.Stub.Proxy。 * * * * * **注意**:IContentObserver.java由aidl处理IContentObserver.aidl生成,其位置在out/targer/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/database/IContentObserver.java中。 * * * * * 2. registerContentObserver函数分析 下面来看ContentService的registerContentObserver函数的代码。 **ContentService.java::registerContentObserver** ~~~ public void registerContentObserver(Uri uri,boolean notifyForDescendents, IContentObserver observer) { ...... synchronized (mRootNode) { //ContentService要做的事情其实很简单,就是保存uri和observer的对应关系到 //其内部变量mRootNode中 mRootNode.addObserverLocked(uri, observer, notifyForDescendents, mRootNode, Binder.getCallingUid(), Binder.getCallingPid()); } ~~~ mRootNode是ContentService的成员变量,其类型为ObserverNode。ObserverNode的组织形式是数据结构中的树,其叶子节点的类型为ObserverEntry,它保存了uri和对应的IContentObserver对象。本节不关注它们的内部实现,读者若有兴趣,不妨自行研究。 至此,客户端已经为某数据项设置了ContentObserver。再来看通知机制实施的第二步,即通知观察者。