首页 > 代码库 > 内容提供者和内容观察者

内容提供者和内容观察者

1、创建一个内容提供者,继承contentProvider,作为四大组件之一,contentProvider需要在配置文件中进行配置

 <provider             android:name="cn.itcast.mobilesafe.provider.AppLockedProvider"            android:authorities="cn.itcast.applockprovider">        </provider>

2、

package cn.itcast.mobilesafe.provider;import cn.itcast.mobilesafe.db.dao.AppLockedDao;import android.content.ContentProvider;import android.content.ContentValues;import android.content.UriMatcher;import android.database.Cursor;import android.net.Uri;import android.util.Log;/** * 这是程序锁的内容提供者 * 当数据库中的数据发生变化,需要及时的更新数据 * @author ygl * */public class AppLockedProvider extends ContentProvider {    private static final int INSERT = 10;    private static final int DELETE = 11;    private static final String TAG = "AppLockedProvider";    //定义一个uri的匹配码(不匹配时的返回值)    private AppLockedDao appdao;    private static UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);    private static Uri uriChange=Uri.parse("content://cn.itcast.applockprovider");        static{        matcher.addURI("cn.itcast.applockprovider", "insert", INSERT);        matcher.addURI("cn.itcast.applockprovider", "delete", DELETE);    }        public boolean onCreate() {        appdao=new AppLockedDao(getContext());        return false;    }    public Cursor query(Uri uri, String[] projection, String selection,            String[] selectionArgs, String sortOrder) {        // TODO Auto-generated method stub        return null;    }    public String getType(Uri uri) {        // TODO Auto-generated method stub        return null;    } /*  * 当内容提供者发生数据插入操作,可以将数据插入到数据库中去  * @see android.content.ContentProvider#insert(android.net.Uri, android.content.ContentValues)  */    public Uri insert(Uri uri, ContentValues values) {        int result=matcher.match(uri);        if(result==INSERT){            String packname=(String) values.get("packname");            Log.i(TAG, "要更改的包名为"+packname);            //创建一个内容观察者去告诉内容提供者数据要进行改变            appdao.add(packname);            getContext().getContentResolver().notifyChange(uriChange, null);        }else{            throw new IllegalArgumentException("uri地址不正确");        }        return null;    }/* * 当内容提供者发生数据删除操作时将数据从数据库中删除 * @see android.content.ContentProvider#delete(android.net.Uri, java.lang.String, java.lang.String[]) */    public int delete(Uri uri, String selection, String[] selectionArgs) {        int result=matcher.match(uri);        if(result==DELETE){            String packname=selectionArgs[0];            appdao.delete(packname);            getContext().getContentResolver().notifyChange(uriChange, null);        }else{            throw new IllegalArgumentException("uri地址不正确");        }        return 0;    }    public int update(Uri uri, ContentValues values, String selection,            String[] selectionArgs) {        // TODO Auto-generated method stub        return 0;    }}

3、通过内容提供者来进行数据的操作(lockAppActivity.java)

 if(appDao.find(packageName)){             //appDao.delete(packageName);             //使用内容提供者来进行数据的操作             getContentResolver().delete(Uri.parse("content://cn.itcast.applockprovider/delete"), null, new String[]{packageName            });                                       iv_appLock.setImageDrawable(getResources().getDrawable(R.drawable.unlocked));         }else{         //appDao.add(packageName);        //使用内容提供者来进行数据的操作            ContentValues cv= new ContentValues();            cv.put("packname", packageName);          getContentResolver().insert(Uri.parse("content://cn.itcast.applockprovider/insert"), cv);         iv_appLock.setImageDrawable(getResources().getDrawable(R.drawable.locked));    }

4、内容观察者观察内容提供者,检测里面的数据是否发生变化(AppLockService.java)

getContentResolver().registerContentObserver(Uri.parse("content://cn.itcast.applockprovider/insert"), true,new myObserve(new Handler()));
/*     * 内容观察者     */    private class myObserve extends ContentObserver{        public myObserve(Handler handler) {            super(handler);        }        public void onChange(boolean selfChange) {            super.onChange(selfChange);            //当发现内容提供者里面的内容发生改变,则重新更新里面的内容            packnamesList=appDao.getAllPackNames();                    }                }

 

内容提供者和内容观察者