ContentProvider组件的实现原理

    内容摘自罗升阳的Android系统源代码情景分析。

    作为Android应用程序的四大组件之一,Content Provider除了可以用来作为数据访问接口之外,还可以在不同的应用程序之间进行数据共享。

    Android系统中,每一个应用程序只可以访问自己创建的数据。然而,有时候我们需要在不同的应用程序之间进行数据共享,例如很多程序都需要访问通讯录中的联系人信息来实现自己的业务功能。由于通讯录本身是一个独立的应用程序,因此,其他应用程序是不能直接访问它的联系人信息的,这时候就需要使用Content Provider组件来共享通讯录中的联系人信息了。

    Content Provider组件可以在不同的应用程序之间进行数据共享,因此它在软件平台建设中非常有用。从垂直的方向来看,一个软件平台至少由数据层、数据访问层、业务层构成。在Android系统中,数据层可以使用数据库、文件或者网络来实现,业务层可以使用一系列应用来实现,而数据访问层可以使用Content Provider组件来实现。

    在这个软件平台架构中,为了降低业务层中各个应用之间的耦合度,每一个应用都使用一个Android应用程序来实现,并且它们都是运行在独立的进层中。同样,为了降低业务层和数据层的耦合度,我们也将数据访问层即Content Provider组件运行在一个独立的应用程序进程中。通过这样的划分,Content Provider组件就可以按照自己的方式来管理平台数据,而上层的Android应用程序不需要关心它的具体实现,只要和它约定好数据访问接口就行了。

    Content Provider组件是如何将它里面的数据共享给业务层的Android应用程序访问的呢。不同的应用程序进程可以通过Binder进程间通信的机制来通信,但如果在传输的数据量很大的时候,直接使用Binder进程间通信机制传递数据,那么数据传输效率就会成为问题。不同的应用程序进程可以通过匿名共享内存来传输大数据,因为无论多大的数据,对匿名共享内存来说,需要在进程间传递的仅仅是一个文件描述符而已。这样,结合Binder进程间通信机制以及匿名共享内存机制,Content Provider组件就可以高效地将它里面的数据传递给业务层中的Android应用程序访问了。

    Content Provider组件的启动过程:

    在前面,我们在应用程序ArticlesProvider中实现了一个Content Provider组件ArticlesProvider,它用来管理一个博客文章列表。当应用程序Article中的MainActivity组件第一次访问ArticvlesProvider组件时,系统会将ArticlesProvider组件启动起来。由于ArticlesProvider组件的android:multiprocess属性设置为false。因此,系统就会在一个独立的应用程序进程中启动它。下面是Content Provider组件在一个独立的应用程序进程中启动的过程:

    (1)MainActivity组件通过Artivles.CONTENT_URI来访问AriticlesProvider组件,以便可以获得它的博客文章条目的总数。

    (2)MainActivity组件所运行在的应用程序进程发现它里面不存在一个用来访问ArticlesProvider组件的代理对象,于是,它就会通过Articles.CONTENT_URI来请求ActivityManagerService返回一个用来访问ArticlesProvider组件的代理对象。

    (3)ActivityManagerService发现ArticlesProvider组件还没有启动起来,于是它就会先创建一个新的应用程序进程,然后在这个新创建的应用程序进程中启动ArticlesProvider组件。

    (4)ArticlesProvider组件启动起来之后,就会将自己发布到ActivityManagerService中,以便ActivityManagerService可以将它的一个代理对象返回给MainActivity组件使用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值