ContentProvider使用

Android-ContentProvider使用

一 建立ContentProvider服务器端 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的服务器端类 * @author chengzhi * */{(Uri arg0, String arg1, String[] arg2){// TODO Auto-generated method stubif (arg0.getAuthority().contains(“com.chengzhi.androidcontentprovider”)){Log.i(“chengzhi log”, “delete”);}return 0;}String getType(Uri arg0){// TODO Auto-generated method stubif (arg0.getAuthority().contains(“com.chengzhi.androidcontentprovider”)){Log.i(“chengzhi log”, “getType”);}return null;}Uri insert(Uri arg0, ContentValues arg1){// TODO Auto-generated method stubif (arg0.getAuthority().contains(“com.chengzhi.androidcontentprovider”)){Log.i(“chengzhi log”, “insert”);}return null;}(){;}Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,String arg4){// TODO Auto-generated method stubif (arg0.getAuthority().contains(“com.chengzhi.myprovider”)){Log.i(“chengzhi log”, “query”);}return null;}(Uri arg0, ContentValues arg1, String arg2, String[] arg3){// TODO Auto-generated method stubif (arg0.getAuthority().contains(“com.chengzhi.androidcontentprovider”)){Log.i(“chengzhi log”, “updata”);}return 0;}}

2 在manifest文件中注册这个类

=>

二 建立客户端的类 主要使用ContentResolve对象来操作服务器端的接口方法 //设置一个按钮的事件监听

Button _buttonQuery = (Button)findViewById(R.id.buttonQuery);_buttonQuery.setOnClickListener(new OnClickListener(){(View arg0){// TODO Auto-generated method stubContentResolver _contentResolver = getContentResolver();//必须加上content://标准前缀Cursor _cursor = _contentResolver.query(Uri.parse(“content://com.chengzhi.myprovider”), null, null, null, null);}});

三 注意 1 在服务器端查询方法中,使用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

接受失败也等于给了自己从零开始的机会,

ContentProvider使用

相关文章:

你感兴趣的文章:

标签云: