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

Android-ContentProvider使用

2016-04-23 13:27 417 查看
Android-ContentProvider使用

一 建立ContentProviderserver端

1 建立一个继承自ContentProvider的类并重写接口方法(这里仅打一些log做代表)

package com.chengzhi.androidcontentprovider;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;
import android.widget.Toast;

/**
* ContentProvider的server端类
* @author chengzhi
*
*/
public class MyContentProvider extends ContentProvider
{
1。 //重写delete方法
@Override
public int delete(Uri arg0, String arg1, String[] arg2)
{
// TODO Auto-generated method stub
if (arg0.getAuthority().contains("com.chengzhi.androidcontentprovider"))
{
Log.i("chengzhi log", "delete");
}
return 0;
}
2。 //重写getType方法
@Override
public String getType(Uri arg0)
{
// TODO Auto-generated method stub
if (arg0.getAuthority().contains("com.chengzhi.androidcontentprovider"))
{
Log.i("chengzhi log", "getType");
}
return null;
}
3, //重写insert方法
@Override
public Uri insert(Uri arg0, ContentValues arg1)
{
// TODO Auto-generated method stub
if (arg0.getAuthority().contains("com.chengzhi.androidcontentprovider"))
{
Log.i("chengzhi log", "insert");
}
return null;
}
@Override
public boolean onCreate()
{
// TODO Auto-generated method stub
return false;
}
4, //重写query方法
@Override
public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,
String arg4)
{
// TODO Auto-generated method stub
if (arg0.getAuthority().contains("com.chengzhi.myprovider"))
{
Log.i("chengzhi log", "query");
}
return null;
}
5。 //重写update方法
@Override
public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3)
{
// TODO Auto-generated method stub
if (arg0.getAuthority().contains("com.chengzhi.androidcontentprovider"))
{
Log.i("chengzhi log", "updata");
}
return 0;
}

}


2 在manifest文件里注冊这个类

<provider android:name="MyContentProvider" android:authorities="com.chengzhi.myprovider"(可以自己定义)></provider>


二 建立client的类

主要使用ContentResolve对象来操作server端的接口方法

//设置一个按钮的事件监听

Button _buttonQuery = (Button)findViewById(R.id.buttonQuery);
_buttonQuery.setOnClickListener(new OnClickListener()
{

@Override
public void onClick(View arg0)
{
// TODO Auto-generated method stub
ContentResolver _contentResolver = getContentResolver();
//必须加上content://标准前缀
Cursor _cursor = _contentResolver.query(Uri.parse("content://com.chengzhi.myprovider"), null, null, null, null);

}
});


三 注意

1 在server端查询方法中。使用getContentResolver().query()后,尽量使用startManagerCursor(Cursor)方法来将Cursor的

生命周期托管给当前的Activity。这样Cursor的生命周期和Activity便可以自己主动同步,防止当前的Activity退出后,cursor依旧存在导致内存泄露

2 当前Activity调用另外一个没有启动的进程的ContentProvider,

将当前项目的manifest文件里的provider中的android:multiprocess=”true”即同意其它进程訪问

3 ContentProVider的机制

在程序安装和卸载的时候,会将ContentProvider类register和unregister到系统的ProviderManager中。

当使用ContentResolver来传入Uri的时候

在Providermanager中在链表找到该Uri来匹配并启动不同的进程

因此进程不是通过Activity启动。而是通过Provider来启动的

binder机制

4 宿主进程的生命周期

接收调用的时候启动宿主进程,操作完成后,宿主进程为empty
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: