您的位置:首页 > 移动开发 > Android开发

Android四大组件之内容提供者

2016-10-31 15:59 776 查看

一、学习目标

1.内容提供者(contentProvider)

2.内容解析者(contentResover)

3.内容观察者(contentObserver)

二、contentProvider

1.为什么需要内容提供者

如果B应用需要用到A应用中的(私有)数据库中的数据,由于跨应用,同时A应用数据库的访问权限的原因,导致无法实现,为了解决这个问题,Google工程师就提出了内容提供者(contentProvider),即,A应用需要使用contentProvider来把自己的数据呈现给B应用(其他应用)。

2.内容提供者的原理



其中内容提供者就作为中间人将应用1的数据呈现给应用2。

3.实现内容提供者的具体步骤

①定义内容提供者 定义一个类继承contentProvider,需要重写方法,其中重要的有四个(增删改查)方法和oncreate()方法

public class Myprovider extends ContentProvider {

//当内容提供者初始化 会执行该方法
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
return null;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
return null;
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}

}

②在清单文件里面配置一下 (由于是四大组件,都需要配置)

 <provider android:name="com.gao.db.AccountProvider"

            android:authorities="com.gao.provider"

 </provider>

③定义一个urimatcher (需要解析uri地址),写一个静态代码块,添加匹配规则,来设置外部应用访问的uri地址(类似于浏览器访问网站,eg:访问百度,http://www.baidu.com)

static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

static {
sUriMatcher.addURI("com.gao.provider", "query", QUERYSUCCESS);//即外部访问的uri为:content://com.gao.provider/qurey  下同
sUriMatcher.addURI("com.gao.provider", "insert", INSERTSUCCESS);
sUriMatcher.addURI("com.gao.provider", "update", UPDATESUCCESS);
sUriMatcher.addURI("com.gao.provider", "delete", DELETESUCCESS);
}

④按照我们添加的匹配规则 暴露想暴露的方法(即: 可以为外部应用提供对数据的增删改查等方法。)

☆☆☆:最后只要是通过内容提供者暴露出来的数据 其他应用访问的方式都是一样的,就是通过内容解析者 

三、contentResolver

同样B应用为了得到A应用(已经使用了内容提供者暴露)的数据,就需要内容解析者来解析A应用暴露出来的数据。

实现步骤:

通过 getContentResolver()的到内容解析者,然后按自己的需求(增删改查)来实现对应的方法。

eg:Uri uri = Uri.parse("content://com.gao.provider/query");//前面内容提供者定义的uri
Cursor cursor = getContentResolver().query(uri,new String[] { "name", "money" }, null, null, null);//按找自己需求填写参数

四、内容观察者

应用A和应用B为了知道数据是否发生了改变,于是就用到了内容观察者(contentObserver)。内容观察不是四大组件,不需要在清单文件里配置。

实现步骤:

①在内容提供者中,如果数据改变了,就发送消息,来通知大家数据库被改动了。

getContext().getContentResolver().notifyChange(uri, null);//uri 是通过那个uri来访问修改,就填那个uri

②在其他应用中注册内容观察者

//第二个参数:false时:表示观察的uri 必须是一个确切的uri 。true时,反之

getContentResolver().registerContentObserver(uri, true, new MyContentObserver(new Handler()));
③定义内容观察者

private class MyContentObserver extends ContentObserver{
public MyContentObserver(Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
}
//当我们的观察的Uri发生改变的时候调用
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
System.out.println("haha  数据库备操作了");
super.onChange(selfChange);
}
}

五、总结

把这三者联系起来,是非常好理解的。了解三者的功能,再查看api来学习各类中的方法、变量等。

由于内容提供者是某应用为了共享数据,提供数据的目的,因此使用的场所就比较少,于是,它主要运用在需要一些访问系统应用的数据的应用中,例如:备份联系人、备份短信。

内容观察者的应用场所也不多,主要用于监听系统数据(你懂)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: