1.Content Provider作用

进程间进行数据交互&共享,即跨进程通信

 
contentprovider作用图.png

2.Content Provider原理

content provider底层是采用Android中Binder机制。

2.1统一资源标识符(URI)
  • 作用:唯一标识content provider&其中的数据

外界进程通过URI找到对应的content provider&其中的数据,再进行数据操作

  • 具体使用(自定义)

     
    自定义URI
        //设置uri
Uri parse = Uri.parse("content://com.carson.provider/User/1");
//指向的资源为:名为'com.carson.provider'
//的contentProvider中表名为‘User'中的'id'为1的数据
2.2MIME数据类型
  • 指定某个拓展名的文件用某种应用程序来打开。如指定 .html文件采用text应用程序打开,指定.pdf文件采用flash应用程序打开。
  ContentProvider.getType(uri);//根据uri,返回MIME类型。

2.ContentProvider类

  • 2.1Contentprovider主要以表格的形式组织数据

    同时也支持文件数据,只是表格的数据比较多。
  • 主要方法,进程间共享数据的本质是:添加、删除、获取和修改数据。
<-- 4个核心方法 -->
public Uri insert(Uri uri, ContentValues values)
// 外部进程向 ContentProvider 中添加数据
public int delete(Uri uri, String selection, String[] selectio
nArgs)
// 外部进程 删除 ContentProvider 中的数据
public int update(Uri uri, ContentValues values, String select
ion, String[] selectionArgs)
// 外部进程更新 ContentProvider 中的数据
public Cursor query(Uri uri, String[] projection, String selec
tion, String[] selectionArgs, String sortOrder)
// 外部应用 获取 ContentProvider 中的数据
// 注:
// 1. 上述4个方法由外部进程回调, 并运行在ContentProvider进程的Binder
线程池中( 不是主线程)
// 2. 存在多线程并发访问, 需要实现线程同步
// a. 若ContentProvider的数据存储方式是使用SQLite & 一个, 则不需要, 因为SQLite内部实现好了线程同步,
// 若是多个SQLite则需要, 因为SQL对象之间无法进行线程同步
// b. 若ContentProvider的数据存储方式是内存, 则需要自己实现线程同步
<-- 2个其他方法 -->
public boolean onCreate()
// ContentProvider创建后 或 打开系统后其它进程第一次访问该ContentProvi
der时 由系统进行调用
// 注: 运行在ContentProvider进程的主线程, 故不能做耗时操作
public String getType(Uri uri)
// 得到数据类型, 即返回当前 Url 所代表数据的MIME类型

3.ContentObserver 类

内容观察者,观察Uri引起contentprovider中的数据变化并通知外界。

具体使用:

// 步骤1: 注册内容观察者ContentObserver
getContentResolver().registerContentObserver(uri);
// 通过ContentResolver类进行注册, 并指定需要观察的URI
// 步骤2: 当该URI的ContentProvider数据发生变化时,
// 通知外界( 即访问该ContentProvider数据的访问者)
public class UserContentProvider extends ContentProvider {
public Uri insert(Uri uri, ContentValues values) {
db.insert("user", "userid", values);
getContext().getContentResolver().notifyChange(uri, null);
// 通知访问者
}
}
// 步骤3: 解除观察者
getContentResolver().unregisterContentObserver( uri) ;
// 同样需要通过ContentResolver类进行解除

作者:木小伍
链接:https://www.jianshu.com/p/4b9b61f99069
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Content Provider详解(太懒不想抄)的更多相关文章

  1. Content Provider 详解

    几个概念:Cursor. Content provider . Uri  .contentresolver 1. Cursor : 个人理解为数据库中的一行数据,它是每行数据的集合.它是一个类.通过它 ...

  2. Content Providers详解

    今天仔细阅读了一遍Content Providers的官方API文档,总结了一下Android中Content Providers的用法. 各种类型的Content Provider对一个结构化的数据 ...

  3. android 四大组件详解

    这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解二.Service详解三.Broadcast Receiver详解四.Content Provider详解外加一个重 ...

  4. Android基础夯实--重温动画(四)之属性动画 ValueAnimator详解

    宝剑锋从磨砺出,梅花香自苦寒来:千淘万漉虽辛苦,吹尽狂沙始到金: 长风破浪会有时,直挂云帆济沧海 一.摘要 Animator类作为属性动画的基类,它是一个抽象类,它提供了实现动画的基本架构,但是我们不 ...

  5. AndroidMainfest详解

    基于TV settings和SettingsProvider Android启动模式对activity行为的影响 AndroidManifest.xml文件详解 Manifest文件中,applica ...

  6. JavaScript 各种遍历方式详解及总结

    JavaScript 各种遍历方式详解 在$.each中想要终止循环,但是它没有continue或者break这样的终止方式,所以尝试使用return来进行终止,但是发现并没有跳出循环.为了搞清楚js ...

  7. dsu on tree (树上启发式合并) 详解

    一直都没出过算法详解,昨天心血来潮想写一篇,于是 dsu on tree 它来了 1.前置技能 1.链式前向星(vector 建图) 2.dfs 建树 3.剖分轻重链,轻重儿子 重儿子 一个结点的所有 ...

  8. 入职小白随笔之Android四大组件——内容提供器详解(Content Provider)

    Content Provider 内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间 实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的 ...

  9. content = "IE=edge,chrome=1" 详解

    content = "IE=edge,chrome=1" 详解 < meta http-equiv = "X-UA-Compatible" content ...

  10. TCP/IP详解学习笔记 这位仁兄写得太好了

      TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣 ...

随机推荐

  1. STM32F4库函数初始化系列:PWM输出

    1 void _TIM4_Configuration(void) 2 { 3 /* TIM4 Configuration --------------------------------------- ...

  2. JZOJ 3423.Vani和Cl2捉迷藏 & [CTSC2008]祭祀

    \(\text{Problem}\) 求一个 \(DAG\) 的最长反链 \(\text{Solution}\) 由 \(Dilworth\) 定理只最长反链等于最小链覆盖 而原图的链是可相交的,所以 ...

  3. JZOJ 5415. 【NOIP2017提高A组集训10.22】公交运输

    题目 城市中有一条长度为 \(n\) 的道路,每隔 \(1\) 的长度有一个公交车站,编号从 \(0\) 到 \(n\),学校在 \(0\) 号车站的位置.其中每个公交车站(除了 \(n\) 号车站) ...

  4. JZOJ 4417. 【HNOI2016模拟4.1】神奇的字符串

    不能算解析的解析 很神仙的题 知道做法后很容易实现 这里不写题解 推荐一个:4417. [HNOI2016模拟4.1]神奇的字符串 感谢写此博文的神犇! \(Code\) #include<cs ...

  5. reids(2)概述与安装

    前言 redis安装在Linux服务器上,系统为centos7,安装的版本为redis6.2.10 下载与安装 下载地址:https://redis.io/download/#redis-downlo ...

  6. Flutter:StatefulWidget 怎么传参

    定义好一个有状态(或无状态)的组件之后,需要为其传递一些参数,希望组件能够更加灵活使用.那么,在 Flutter 中如何为其传递参数呢? 以下是 StatefulWidget 传递值的步骤,一共三步: ...

  7. OpenLayers与百度高德等常见地图坐标系

    1. OpenLayers坐标系 OpenLayers中,创建一个Map,默认的显示(View)的投影坐标系是EPSG:3857,常见的另一个坐标系是 EPSG:4326 参考官方API文档:Open ...

  8. helm在k8s上部署Elasticsearch和Kibana

    前提 在win上安装docker desktop,没有网络限制,而且,打开kubernetes之后,很快就安装启动好了. 在win上安装scoop,有网络限制,需要访问github raw的文件内容, ...

  9. 添加 Echarts bi库

    1.安装库和依赖 npm i echarts --save npm i ngx-echarts --save npm i resize-observer-polyfill --save-dev 2.相 ...

  10. Linux新手渣渣上路史

    Linux新手渣渣上路史 时至2022年,IT行业的迅速发展大家也有目共睹,IT行业在社会的发展中起着举足轻重的作用.其中一角Linux系统,从诞生到开源,再到现在受大众的欢迎,是一个很好的例子.Li ...