这一篇要说两个问题,一个是ContentProvider数据监听机制,另一个就是ContentProviderConnection这个东东。
ContentProvider中的监听机制是一个观察者模式的实现。从使用方式就可以看出来
getContentResolver().registerContentObserver(CONTENT_URI, true, mContentObserver);
getContentResolver().notifyChange(changed_content_uri, null);
public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer, int userHandle) { try { getContentService().registerContentObserver(uri, notifyForDescendents, observer.getContentObserver(), userHandle); } catch (RemoteException e) { } }
public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork, int userHandle) { try { getContentService().notifyChange( uri, observer == null ? null : observer.getContentObserver(), observer != null && observer.deliverSelfNotifications(), syncToNetwork, userHandle); } catch (RemoteException e) { } }
从这两个方法上来看,并没有直接将Observer注册在ContentProvider中,它们之间还有一个中介,而这个就是ContentService。顾名思义,这是一个服务并且呢是一个系统级的服务。这倒是符合android设计的一贯原则,将管理的工作都交给系统服务来做,关于这个类的详细介绍可以参见此博文:http://blog.csdn.net/banketree/article/details/9188179
还有一个请注意,这里的内容监听操作涉及到客户端、provider和contentservice三个进程,所以理所当然的也有跨进程哦,这里的跨进程操作主要是发生在ContentObserver这里,是它里面的Transport来实现的。
然后说一下ContentProviderConnection,其实这个玩意我也没有弄明白,字面上意思看就是一个共享数据连接,但是看起实现也没有任何起到连接通道以及传输的意思,只是单纯的客户端进程记录与当前内容提供者记录的容器只是本身继承于Binder,并且看其使用也多数是在ActivityManagerService中注册和移除Provider的时候。可能还真是一个可以在进程间传递并且保持相互引用关系的东东,这个有谁能全面分析一下的可以留言告诉在下,不甚感激。。。