zoukankan      html  css  js  c++  java
  • android学习笔记55——ContentProvider_2

    实现ContentProvider

    创建ContentProvider的步骤:

    1.开发一个ContentProvider的子类,该子类需要实现增、删、改、查等方法;

    2.在AndroidMainfest.xml文件中注册该ContentProvider

    开发ContentProvider时所实现的增、删、改、查方法都需要一个Uri参数,该参数决定了对那个Uri执行数据操作。

    为了确定该ContentProvider实际能匹配的Uri,以及确定每个方法中Uri参数所操作的数据,android系统提供了UriMatcher工具类。

    Uri工具类——UriMatcher主要提供了如下两个方法:

    void addURI(String authority,String path,int code) 该方法用于向UriMatcher对象注册Uri.其中authority和path组成一个Uri,而code则代表该Uri对应的标识码
    int match(Uri uri) 根据前面注册的Uri来判断指定Uri对应的标识码。如果找不到匹配的标识码,该方法将会返回-1

    后续补充.....

      

    监听ContentProvider的数据改变

    ContentObserver简介

    ContentProvider无论实现insert()、delete()、update()方法中的任何一个,只要该方法导致了ContentProvider里数据的改变,程序就调用了如下代码:

    getContent.getContentResolver().notifyChange(uri,null)——用于通知所有注册在该Uri上的监听者,通知该ContentProvider所共享的数据发生了改变。

    为了在应用程序中监听ContentProvider数据的改变,需要利用Android提供的ContentObserver基类.

    监听ContentProvider数据改变的监听器需要继承ContentObserver类,并重写该基类所定义的onChange(boolean selfChange)

    ——当其监听的ContentProvider的数据发生改变时,onChange将会被触发。

    为了监听指定的ContentProvider的数据变化,需要通过ContentResolver向指定的Uri注册ContentObserver监听器。

    ContentResolver提供如下方法来注册监听器:

    registerContentObserver(Uri uri,boolean notifyForDescendents,ContentObserver observer):

    uri——该监听器所监听的ContentProvider的Uri; 

    notifyForDescendents——如果该参数设置为true,假设注册监听的Uri为content:abc,那么Uri为Content://abc/xyz、content://abc/xyz/foo的数据改变时也会触发该监听器;

                  如果该参数设置为false,假设注册监听的Uri为content:abc,那么只有content:abc的数据改变时也会触发该监听器;

    observer——监听器实例。

    EG:如下代码片段可用于为指定Uri注册监听器:getContentResolver().registerContentObserver(Uri.parse("content://sms"),true,new SmsOberver(new Handler()));

    实例如下:

    监听用户发出的短信

    总结:ContentProvider的本质就是一个“网站”,其可以把应用程序的数据按照“固定规范”暴露出来,其他应用程序就可通过ContentProvider暴露的接口来操作内部的数据了。

    可理解为:ContentProvider是Android系统内不同程序之间进行数据交换的标准接口。

    ContentResolver用于操作ContentProvider提供的数据;

    ContentObserver用于监听ContentProvider的数据改变;

    ContentProvider则是所有ContentProvider组件的基类。

  • 相关阅读:
    设计模式面试
    Netty面试
    Nginx面试
    java后端面试
    springboot面试专题及答案
    SpringBoot整合Mybatis,TypeAliases配置失败的问题
    vscode调试html文件
    Linux性能检查命令总结[转]
    如何创建systemd定时任务
    Systemd简介与使用
  • 原文地址:https://www.cnblogs.com/YYkun/p/5995653.html
Copyright © 2011-2022 走看看