ContentProvider是干嘛用的?

来源:互联网 发布:linux 网络质量 监控 编辑:程序博客网 时间:2024/04/27 22:25

Android开发的ContentProvider这个东西会看两遍吧。第一遍是整体选系android的时候,因为这个东西是四大组件之一,不看面试的时候不好说啊。第二次应该是实际要用的时候吧,或者像我这样写Activity写烦了想看点别的东西的人。

入正题,ContentProvider是干嘛用的?它被用于跨进程做数据共享用。其实你把Android的四大金刚(组件)放到一起,仔细想想他们各自的用途就会发现都是必不可少。他们共同的特点是跨进程。做为java工程师,想写个跨进程的东西不是很好写吧。

  • Activity用于展示数据内容,不同的activity可以通过intent跨进程进行调用。比如在Gallery中调用邮件分享照片
  • Service用于实现进程间方法的调用。被举得最多的栗子就是UI调用音乐播放服务。Service不仅仅是在后台运行的一段代码而已。如果是这样的话,为什么不自己写个handle-looper在自己的app中默默运行呢?关键在于跨进程通信ipc。
  • ContentProvider用于共享数据。多个进程间共享数据,可以通过共享文件的方法,而共享文件的话,权限自己怎么控制呢?linux的内存映射和管道什么的在android好像调用不了,好吧我没调用过 >_<|||。ContentProvider让开发者能够在拥有读写权限的情况下通过一条地址(比如content://com.fool/tab1)来访问共享数据。
  • BroadcastReceiver,可以接收系统和任意app发出的信号intent,如果通过匹配则配触发。同样是跨进程的。
日常开发的大部分任务都是开发单个进程的app,所以这些跨进程的东西有啥用?如果你的app是个大胖子吃了很多内存(比如图片应用),android对内存是有限制的,oom是经常遇到的头疼的问题吧。android对每个进程的内存使用量是有限制的,而你要是在一个app中开多个进程协同作战,将内存大户发配到不同的进程中,oom就没那么容易了。AndroidManifest.xml的activity内有个process属性,用于让app分配不同进程,而默认都在一个进程中。这时,如果你有相同的内容要在两个不同进程的activity中展示,同时在某些情况下要对其修改,是不是就得用进程数据共享了?ContentProvider在这时就有用场了。
大部分时候都只需要调用系统的ContentResolver来操作,调用参数都被封印在android.provider包的各个类中。MediaStore这个类就很有用哦。访问多媒体资源就靠它了。android继承了linux而拥有了一个类似文件数据库的东西,里面存着各种文件的路径信息。MediaStore就是访问媒体文件的入口。
自己做ContentProvider可以向外提供两种数据:格式化数据和流数据。格式化数据就是类似数据库中的表。当然你不是一提ContentProvider就想起数据库,用一个叫MatrixCursor可以在没有数据库的情况下返回cursor对象。流数据指的就是文件。这包括自己在/data/data中的数据也包括apk中的资源数据。这些数据其他apk在没有root权限的情况下是没法访问的,而ContentProvider说,我能。
怎么自建ContentProvider就去其他地方查吧。