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(); } }
时间: 2024-10-10 18:07:33