四大组件
- Activity 活动,界面
- Service 服务,没有界面,后台长期运行
- BroadcastReceiver 广播接受者
- ContentProvider 内容提供者
内容提供者
把自己应用程序私有的数据,暴露给别的应用程序
内容提供者编写步骤
1、在数据应用程序里面开一个“后门”写一个类继承ContentProvider
MyDBContentProvider extends ContentProvider
2、内容提供者实现类里面默认定义了增删改查的4个方法
query --->Uri
insert--->Uri
delete--->Uri
update--->Uri
3、定义一个匹配器(保安)
private static UriMatcher mUriMatcher = new
UriMatcher(UriMatcher.NO_MATCH);
//如果匹配失败返回-1
4、训练匹配器(训练保安)
static{
//authority 主机名 路径的前缀名
mUriMatcher.addURI("包名","数据库表名",CONTACT_INFO);
//content://包名/数据库表名 -->1
}//添加匹配规则
5、在清单文件中配置内容提供者
<provider name= "" authority="包名同上"
如何调用内容提供者获取私有数据库内容
1、获取内容提供者的解析器
ContentResolver resolver = getContentResolver();
2、利用解析器访问私有的数据库
resolver.query(Uri uri ,...);
resolver.insert(Uri uri ,...);
resolver.delete(Uri uri ,...);
resolver.update(Uri uri ,...);
注意:uri必须指定正确,如果uri错误,访问就会失败.
如何使用内容提供者获取系统应用程序的数据
呼叫记录的内容提供者
com.android.provider.contacts
contacts2.db
虚拟电话
短信的内容提供者
com.android.provider.telephony
mmssms.db
联系人内容提供者
三张表
* raw_contacts
保存联系人的id,每一个联系人都有一个不同的id,名字叫contact_id
data
保存联系人的数据,通过raw_contact_id来去识别这个数据属于哪个联系人
mimetype
保存数据的类型
查询联系人信息的步骤.
- 查询raw_contacts表, 把每个联系人的contact_id.
- 根据contact_id 查询data表,把联系人的数据取出来.
- 根据联系人数据的mimetype,获取数据代表什么含义.
添加联系人信息的步骤.
- 在raw_contacts表里面添加联系人的id.
- 根据这个添加的id,在data表里面添加联系人的数据
内容观察者
ContentResolver resolver = getContentResolver();
// 短信数据库表的uri
Uri uri = Uri.parse("content://sms/");
//注册一个内容观察者
resolver.registerContentObserver(uri, true, new MyObserver(
new Handler()));