ContentProvider简介
多进程的程序之间进行互相通信时,使用ContentProvider可以实现数据的共享,ContentProvider提供的数据可以来自文件,数据库等,通过URI与调用者进行关联.
从这点上看,ContentProvider使应用像一个网站,URI即域名。:-)
在ManiFest文件 中进行声明
<!-- antuorities属性表明当期ContentProvider的URI地址 -->
<provider android:name=".MyProvider"
android:authorities="com.terry.mycontentprovider"
android:exported="true">
</provider>
简单的Provider
public class MyProvider extends ContentProvider{
@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
Log.v("LOG","ContentProvider -- delete()");
return 0;
}
// 获取MIIE类型
@Override
public String getType(Uri arg0) {
return null;
}
@Override
public Uri insert(Uri arg0, ContentValues arg1) {
Log.v("LOG","ContentProvider -- insert()");
return null;
}
@Override
public boolean onCreate() {
Log.v("LOG", "ContentProvider -- onCreate()");
return false;
}
@Override
public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,
String arg4) {
Log.v("LOG","ContentProvider -- query()");
return null;
}
@Override
public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
Log.v("LOG", "ContentProvider --update()");
return 0;
}
}
ContentProvider 的生命周期
ContentProvider 只用一个生命周期,就是onCreate()
当其他应用第一次访问该ContentProvider时,onCreate()方法会被调用一次.
URI
标示ContentProvider的位置,格式如下
实际上,为了能确定ContentProvider实际能处理的Uri,以及确定每个URI参数中所操作数据,需要使用UriMatcher类
ContentResolver
通过Context的getContentResolver()获取该对象,然后对该 对象的操作,实际上是操作的Uri对应的ContentProvider对象
这是另一个APP的界面,用于使用ContentResolver调用ContentProvider
布局很简单,上面有四个Button对应CRUD四个操作,现在只用前两个为例
public class MainActivity extends ActionBarActivity {
private ContentResolver mResolver;
// 获取URI对象,与上面的保持一致
private static Uri URI = Uri.parse("content://com.terry.mycontentprovider");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mResolver = getContentResolver();
}
public void query(View v) {
Log.v("LOG", "ContentResolver -- query()");
mResolver.query(URI, null, null, null, null);
}
public void insert(View v) {
Log.v("LOG", "ContentResolver -- insert()");
ContentValues c = new ContentValues();
c.put("Key", "Value");
mResolver.insert(URI, c);
}
}
好了,看下Log的顺序吧。
05-18 04:59:17.413: V/LOG(4599): ContentResolver -- query()
// 在第一次使用ContentProvider时,会回调一次ContentProvider
05-18 04:59:17.576: V/LOG(4621): ContentProvider -- onCreate()
05-18 04:59:17.582: V/LOG(4621): ContentProvider -- query()
05-18 04:59:21.541: V/LOG(4599): ContentResolver -- insert()
05-18 04:59:21.565: V/LOG(4621): ContentProvider -- insert()