数据共享的应用场景:
微信安装,遍历联系人的信息 --- 取出电话号码 ---->查询服务器的数据库 --->是否是微信用户
问题:
取出联系人的电话号码
之前的解决方案:
1、获取数据存储的文件
2、根据文件创建相应的解析对象
3、读取
存在问题:
1、权限问题 --- 可能没有权限
2、文件存储多样 --- 
A.存储格式多样
B.存储路径多样
导致的问题:数据的读取方式也多样化


可不可以提供一个标准的,风格统一的方式进行数据读取,Android解决方案,通过数据共享实现
1、Android数据共享实现方案
2、数据共享模型
A.数据提供者
B.数据访问者
C.数据提供者提供的访问实现和标准
D.数据访问者按照标准访问
3、数据提供方
操作:数据操作的具体实现
配置:和Activity一样需要配置
     android:name----对应的数据操作类
     android:authorities --- 标识
     android:exported ----- true
权限:数据不能被任意操作 ---- 限制
协议:content --------------- 默认的
   数据操作方
按照协议操作
content://uri
UriMatcher的作用
A.如果数据提供者存在多张表,那么可以通过Uri添加额外信息来制定要操作的表
B.解析Uri的附加信息 --- UriMatcher作用
就是解析Uri信息的
C.根据解析的返回码,执行相应的操作

注意:UriMatcher添加的URIS一般都以要操作的表名为Path


Android数据共享优点:
A.风格统一,封装性好
B.安全 --- 可以暴露非隐私信息,隐藏部分信息
  可以隐藏不必要的信息
缺点:
部分场景使用不便


4、获取系统共享数据:

   获取系统的数据共享协议
1、查看源码
2、
   短信 ------
权限 --- 

   联系人 ---- 数据库表结构
1、表之间的关系 --- 有关系的表四张
contacts raw_contacts data mimetype
2、视图的作用
操作的是视图 ------ 注意获取数据时,使用的列名称
3、协议 --- content://com.android.contacts;contacts
URI --- 后缀的Path是表名
声明协议的规律
4、权限
READ
WRITE
   
数据提供者数据改变时主动告知数据改变者,主动告知数据访问者
   监听数据改变 --- ContentReslover
1、监听方注册
2、被监听方发生改变时,唤醒监听
思想:使用多线程的wait和notify
1、数据持有者,当数据改变时,可以通过
Context.getContentReslover().notifyChange(uri,observer);
observer 指定具体的被唤醒对象
2、数据监听者,进行监听注册
Context.getContentResolver().registerContentObserver(uri,boolean,处理对象);
处理对象 ---- 在onChange中进行数据处理
boolean 值 -- 是否严格匹配URI
     true ---- 以指定的Uri开头即可