内容提供者和内容观察者

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

内容提供者和内容观察者的相关文章

Android10_内容提供者_内容观察者_标题栏

安卓四大组件Activity ,Service,BroadCastReceiver,ContentProvider(内容提供者) 1.1内容提供者的作用: 应用程序创建的数据库默认都是私有的,别的应用程序不可以访问里面的数据,如果有需求把自己应用程序私有的数据库暴露给别的用户增删改查,就需要使用内容提供者. 1.2 内容提供者的代码实现 在需要提供给它人数据的应用中 ①创建一个项目,并且创建数据库(数据库开启帮助类)(非必要) ②创建一个类,继承ContentProvider内容提供者, 内容提

内容提供者写法

内容提供者写法 内容提供者主要是提供接口给第三方应用调用,增删改查. 第一步:建一个类实现ContentProvider package com.miquan.demo; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.

Android基础笔记(十三)- 内容提供者原理和简单使用

为什么要有内容提供者 内容提供者的工作原理 使用内容解析者对内容提供者进行增删改查操作 利用内容提供者和内容解析者备份手机短信 利用内容提供者插入短信 为什么要有内容提供者 内容提供者技术的目的是: 把私有数据库的数据的内容暴露给外部使用: 我们知道,微信.QQ等应用都可以读取手机中联系人和短信的数据.而联系人和短信都是系统内置的应用,它们的数据都存储在相应的数据库中. 在com.android.provider.telephony/databases/mmssms.db就是短信的数据库,通过下

内容提供者学习笔记

##内容提供者笔记## ###步骤### 1.创建实现了ContentProvider的子类MyContentProvider并重写父类的方法 2.作为android四大组件之一,要在manifest.xml文件中注册provider标签 <provider             android:name="cn.itcast.db.MyContentProvider"             android:authorities="cn.itcast.db.per

Android 内容提供者(ContentProvider)的简单实用

Android 中的数据库是对应用私有的,自己是无法使用别的应用的数据库的.但是往往有需求要我们使用另外一个应用或者系统应用的数据,这时候就彰显了内容提供者,ContentPrivider的作用,他就是两个应用数据的桥梁,通过内容提供者和内容接受者我们可以在不同应用间传递数据. ContentPrivider也可以视为一种数据存储.它存储数据的方式和使用它的应用程序无关,重要的是应用如何以一致的编程接口,来访问存储其中的数据.内容提供者与数据库的使用差不多,也可以增删改查.而且数据可以存储于数据

内容提供者(Content Provider)--跨程序共享数据

内容提供者简介 访问其他应用中的数据 ContentResolver 的基本用法 实例读取系统联系人 创建自己的内容提供器 创建内容提供器的步骤 创建新类继承ContentProvider并且重写其中6个方法 内容URI参数 使用UriMatcher实现匹配内容URI的功能 getType函数介绍 实现跨程序数据共享 内容提供者 访问自己创建的内容提供者数据 遇到的问题 内容提供者简介 使用场景: 比如:电话薄,短信,媒体库 简介 主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整

Android学习笔记-----------内容提供者

Android学习笔记-----------内容提供者 简介 内容提供者主要用于在不同的程序之间实现数据共享的功能;一个程序想要访问其他程序种由内容提供者提供的数据,必须依赖于contentresolver这个类的实例,可以通过getContentResolver()这个方法来获取这个类的实例;这个类提供有query(),insert(),update(),delete()等方法来操作数据这些方法都需要提供个Uri类型的参数,这个Uri对应的就是你需要操作的数据引用.一个uri主要由以以下几个部

android100 自定义内容提供者

#ContentProvider,就是来操作数据的,增删改查, * 四大组件之一 * 应用的数据库是不允许其他应用访问的 * 内容提供者的作用就是让别的应用访问到你的数据库 * 内容提供者的作用:把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用 *短信联系人都是在数据库里面.mmssms是短信数据库, *短信数据库有短信数据库的内容提供者,联系人数据库有联系人数据库的内容提供者.拿到对应数据库的内容提供者就能够访问对应的数据库数据. ###短信数据库 * sms表 * body

11.内容提供者

ContentProvider 四大组件之一 内容提供者的作用:把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用 应用的数据库是不允许其他应用访问的,内容提供者的作用就是让别的应用访问到你的数据库 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代码,举例增方法 @Override publicUri insert(Uri uri,ContentValues values){ db.insert("person",n