zoukankan      html  css  js  c++  java
  • 内容提供者和内容观察者

    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();
                
            }
                
        }
  • 相关阅读:
    linux常用命令
    Hibernate常用API以及使用说明
    Hibernate使用套路,新手请进
    git 完全讲解 无废话,包含在myeclipse中使用,包括解决冲突
    Spring使用事务增加的注解实现方
    java.lang.ClassCastException: com.sun.proxy.$Proxy27 cannot be cast to com.bbk.n002.service.QuestionService
    使用aspectJ实现Spring AOP的两种方式
    用Diff和Patch工具维护源码
    opennebula 补丁制作与补丁升级
    IPMI总结
  • 原文地址:https://www.cnblogs.com/DASOU/p/4197334.html
Copyright © 2011-2022 走看看