前言


  • 作为 Android 的四大组件之一,ContentProvider 可以说是无处不在了。
  • 但是对于我而言,开发过程中看似 ContentProvider 用得很娴熟,却一直没能形成一个完整的体系。
  • 也许大家也有着和我类似的烦恼,于是我特地花了几天的时间,总结了我所知道的知识点,以及面试中可能遇到的问题。将本文分享给大家,希望能帮助大家重新梳理下我们的这个老朋友 ContentProvider 。

最后,希望大家阅读愉快!

文章目录

  • ContentProvider 应用程序间非常通用的共享数据的一种方式,也是 Android 官方推荐的方式。
  • Android 中许多系统应用都使用该方式实现数据共享,比如通讯录、短信等。

ContentProvider

方便大家学习,我在 GitHub 上建立个 仓库


1.1 Android 为什么要设计 ContentProvider 这个组件?

为什么要设计 ContentProvider

  • 很多做 Android 开发的人都不怎么使用它,觉得直接读取数据库会更简单方便。
  • 那么 Android 搞一个内容提供者在数据和应用之间,只是为了装高大上,故弄玄虚?其设计用意在于:
  1. 封装。对数据进行封装,提供统一的接口,使用者完全不必关心这些数据是在 DB ,XML 、Preferences 或者网络请求来的。当项目需求要改变数据来源时,使用我们的地方完全不需要修改。
  2. 提供一种跨进程数据共享的方式。
  3. 应用程序间的数据共享还有另外的一个重要话题,就是数据更新通知机制了。因为数据是在多个应用程序中共享的,当其中一个应用程序改变了这些共享数据的时候,它有责任通知其它应用程序,让它们知道共享数据被修改了,这样它们就可以作相应的处理。

1.2 如何访问自定义 ContentProvider

自定义 ContentProvider

  • ContentResolver 接口的 notifyChange函数来通知那些注册了监控特定 URI的ContentObserver 对象,使得它们可以相应地执行一些处理。
  • ContentObserver 可以通过 registerContentObserver 进行注册。
  • 通过 ContentProvider 的