内容提供者和内容观察者

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();
            
        }
            
    }
原文地址:https://www.cnblogs.com/DASOU/p/4197334.html