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 .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 stubreturn null;}public String getType(Uri uri) {// TODO Auto-generated method stubreturn null;}/** 当内容提供者发生数据插入操作,可以将数据插入到数据库中去* @see android.content.ContentProvider#insert(.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(.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 stubreturn 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();}}