第127页
10.5 实践与练习
1. 编写Android项目,使用MediaPlayer和SurfaceView实现带音量控制的视频播放器。(答案位置:光盘\TM\sl\10\10.10)
2. 编写Android项目,实现控制是否播放按键音。(答案位置:光盘\TM\sl\10\10.11)
第11章 ContentProvider实现数据共享
( 教学录像:42分钟)
Content Provider用于保存和获取数据,并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式,因为在Android中没有提供所有应用共同访问的公共存储区域。本章将介绍如何使用预定义和自定义Content Provider。
通过阅读本章,您可以:
★ 了解Content Provider的基本概念
★ 掌握Content Provider的常用方法
★ 了解系统预定义的Content Provider
★ 了解如何自定义Content Provider
11.1 Content Provider概述
教学录像:光盘\TM\lx\11\ Content Provider概述.exe
Content Provider内部如何保存数据由其设计者决定,但是所有的Content Provider都实现一组通用的方法,用来提供数据的增、删、改、查功能。
客户端通常不会直接使用这些方法,大多数是通过ContentResolver对象实现对Content Provider的操作。开发人员可以通过调用Activity或者其他应用程序组件的实现类中的getContentResolver()方法来获得ContentProvider对象,例如:
ContentResolver cr = getContentResolver();
使用ContentResolver提供的方法可以获得Content Provider中任何感兴趣的数据。
当开始查询时,Android系统确认查询的目标Content Provider并确保它正在运行。系统会初始化所有ContentProvider类的对象,开发人员不必完成此类操作,实际上,开发人员根本不会直接使用ContentProvider类的对象。通常,每个类型的ContentProvider仅有一个单独的实例。但是该实例能与位于不同应用程序和进程的多个ContentResolver类对象通信。不同进程之间的通信由ContentProvider类和ContentResolver类处理。
11.1.1 数据模型
Content Provider使用基于数据库模型的简单表格来提供其中的数据,这里每行代表一条记录,每列代表特定类型和含义的数据。例如,联系人的信息可能以如表11.1所示的方式提供。
表11.1 联系方式
_ID NAME NUMBER EMAIL
001 张×× 123***** 123**@163
002 王×× 132***** 132**@google
003 李×× 312***** 312**@qq
004 赵×× 321***** 321**@126
每条记录包含一个数值型的_ID字段,用于在表格中唯一标识该记录。ID能用于匹配相关表格中的记录,例如,在一个表格中查询联系人的电话,在另一表格中查询其照片。
注意: ID字段前还包含了一条下划线,在编写代码时不要忘记。
查询返回一个Cursor对象,它能遍历各行各列来读取各个字段的值。对于各个类型的数据,它都提供了专用的方法。因此,为了读取字段的数据,开发人员必须知道当前字段包含的数据类型。
11.1.2 URI的用法
每个Content Provider提供公共的URI(使用Uri类包装)来唯一标识其数据集。管理多个数据集(多个表格)的Content Provider为每个数据集提供了单独的URI。所有为provider提供的URI都以“content://”作为前缀,“content://”模式表示数据由Content Provider来管理。
如果自定义Content Provider,则应该为其URI也定义一个常量,来简化客户端代码并让日后更新更加简洁。Android为当前平台提供的Content Provider定义了CONTENT_URI常量。例如,匹配电话号码到联系人表格的URI和匹配保存联系人照片表格的URI分别如下:
android.provider.Contacts.Phones.CONTENT_URI
android.provider.Contacts.Photos.CONTENT_URI
URI常量用于所有与Content Provider的交互中。每个ContentResolver方法使用URI作为其第一个参数。它标识ContentResolver应该使用哪个provider及其中的哪个表格。
下面是Content URI重要部分的总结:
[√]A:标准的前缀,用于标识该数据由Content Provider管理,不需修改。
[√]B:URI的authority部分,用于标识该Content Provider。对于第三方应用,该部分应该是完整的类名(使用小写形式)来保证唯一性。在元素的authorities属性中声明authority。
[√]C:Content Provider的路径部分,用于决定哪类数据被请求。如果Content Provider仅提供一种数据类型,可以省略该部分;如果provider提供几种类型,包括子类型,这部分可以由几部分组成。
[√]D:被请求的特定记录的ID值。这是被请求记录的_ID值。如果请求不仅限于单条记录,该部分及其前面的斜线应该删除。
11.2 预定义Content Provider
教学录像:光盘\TM\lx\11\ 预定义Content Provider.exe
Android系统为常用数据类型提供了很多预定义的Content Provider(声音、视频、图片、联系人等),它们大多位于android.provider包中。开发人员可以查询这些provider以获得其中包含的信息(尽管有些需要适当的权限来读取数据)。Android系统提供的常见Content Provider说明如下。
[√]Browser:读取或修改书签、浏览历史或网络搜索。
[√]CallLog:查看或更新通话历史。
[√]Contacts:获取、修改或保存联系人信息。
[√]LiveFolders:由Content Provider提供内容的特定文件夹。
[√]MediaStore:访问声音、视频和图片。
[√]Setting:查看和获取蓝牙设置、铃声和其他设备偏好。
[√]SyncStateContract:用于使用数据数组账号关联数据的ContentProvider约束。希望使用标准方式保存数据的provider时可以使用。
[√]UserDictionary:在可预测文本输入时,提供用户定义单词给输入法使用。应用程序和输入法能增加数据到该字典。单词能关联频率信息和本地化信息。