ContentProvider和Uri详解222
下列关于contentprovider的描述

下列关于contentprovider的描述ContentProvider是Android中重要的组件之一,它提供了数据共享和访问的机制。
本文将对ContentProvider进行详细的描述和解释。
正文ContentProvider是Android中的一个基础组件,用于实现应用程序之间的数据共享和访问。
它充当了数据访问的中间层,使得不同应用程序之间可以安全地共享数据,同时提供了标准化的接口和方法来进行数据操作。
下面是对ContentProvider的描述和解释:1. ContentProvider是用于在Android应用程序之间共享数据的一种机制。
它允许一个应用程序将自己的数据暴露给其他应用程序,同时提供了标准化的接口和方法来访问和操作这些数据。
2. ContentProvider提供了一种数据抽象的方式,使得应用程序可以通过URI来访问数据,而不需要了解数据的具体存储方式和位置。
这种抽象使得数据的存储和访问可以更加灵活和可扩展。
3. ContentProvider通过使用URI来标识和定位数据。
URI是一种统一资源标识符,它可以唯一地标识数据的位置和类型。
应用程序可以使用URI来获取和操作数据,而不需要了解数据的具体存储细节。
4. ContentProvider提供了一套标准化的接口和方法来进行数据操作,包括CRUD操作(创建、读取、更新和删除)。
这使得应用程序可以使用统一的方式来操作不同类型的数据,无论是数据库、文件系统还是网络数据。
5. ContentProvider还提供了数据权限和安全性的控制机制,可以限制其他应用程序对数据的访问权限。
通过在ContentProvider 中实现权限控制,可以确保数据的安全性和隐私。
总结起来,ContentProvider是Android中重要的组件之一,它提供了数据共享和访问的机制,使得不同应用程序之间可以安全地共享数据。
通过使用标准化的接口和方法,应用程序可以统一地访问和操作数据,而不需要了解数据的具体存储方式和位置。
内容提供者ContentProvider的使用详解

内容提供者ContentProvider的使用详解1.什么是ContentProvider首先,ContentProvider(内容提供者)是android中的四大组件之一,但是在一般的开发中,可能使用的比较少。
ContentProvider为不同的软件之间数据共享,提供统一的接口。
也就是说,如果我们想让其他的应用使用我们自己程序内的数据,就可以使用ContentProvider定义一个对外开放的接口,从而使得其他的应用可以使用咱们应用的文件、数据库内存储的信息。
当然,自己开发的应用需要给其他应用共享信息的需求可能比较少见,但是在Android系统中,很多系统自带应用,比如联系人信息,图片库,音频库等应用,为了对其他应用暴露数据,所以就使用了ContentProvider机制。
所以,我们还是要学习ContentProvider的基本使用,在遇到获取联系人信息,图片库,音频库等需求的时候,才能更好的实现功能2.如何定义一个ContentProviderAndroid系统为了让我们更好的对外暴露数据,提供了统一的接口,所以定义了抽象类ContentProvider,因此,如果我们想对外提供数据,我们需要继承ContentProvider,并且实现下面的这几个方法:onCreate()当我们的provider初始化时被调用,我们应该在这个方法里面完成部分初始化操作query() 查询方法,用于给调用者返回数据insert() 插入操作,用于让外部应用插入数据到内容提供者中update() 更新操作,用于更新内容提供者的数据delete() 用于删除数据getType 返回内容提供者的MIME Type上面这些方法,当我们继承自ContentProvider的时候,eclipse 会自动的给我们添加,但是这并不代表我们每个方法都需要自定义实现。
如果我们只希望给其他应用提供数据,而不允许其他应用修改我们的数据,那么我们只需要实现onCreate(),getType()和query()这三个方法就可以了,其他的三个方法我们可以根据业务需求,实现或者是不实现。
简述contentprovider的工作原理

ContentProvider的工作原理什么是ContentProviderContentProvider是Android中的一个组件,用于实现数据共享和数据访问的机制。
它允许一个应用程序将其数据暴露给其他应用程序,从而实现不同应用之间的数据共享和交互。
ContentProvider可以提供对结构化数据的访问,例如数据库中的表格,也可以提供对非结构化数据的访问,例如文件系统中的文件。
ContentProvider的作用ContentProvider主要有以下几个作用:1.数据共享:ContentProvider可以将一个应用程序的数据暴露给其他应用程序,从而实现数据的共享和交互。
其他应用程序可以通过ContentProvider访问和操作这些数据,而无需了解数据的具体存储方式和实现细节。
2.数据访问:ContentProvider提供了一种标准的接口,其他应用程序可以通过这个接口来访问和操作数据。
这样可以实现数据的统一管理,避免了重复的数据访问和操作代码。
3.数据保护:ContentProvider可以对数据进行权限控制,只有具有相应权限的应用程序才能访问和操作数据。
这样可以保护数据的安全性和私密性。
ContentProvider的工作原理ContentProvider的工作原理可以分为以下几个步骤:1. 注册ContentProvider在AndroidManifest.xml文件中,需要为ContentProvider注册一个相应的标签。
这个标签中需要指定ContentProvider的类名、权限等信息。
<providerandroid:name=".MyContentProvider"android:authorities="com.example.myapp.provider"android:exported="true" />2. 实现ContentProvider创建一个类来实现ContentProvider,并重写相应的方法。
4.1---Content Provider与ContentResolver 简介

如何调用系统的Content Provider一、ContentProvider简介我们说Android应用程序的四个核心组件是:Activity、Service、BroadcastReceiver和ContentProvider。
在Android中,应用程序彼此之间相互独立的,它们都运行在自己独立的虚拟机中。
ContentProvider提供了程序之间共享数据的方法,一个程序可以使用ContentProvider定义一个URI,提供统一的操作接口,其他程序可以通过此URI访问指定的数据,进行数据的增、删、改、查。
ContentProvider应该是Android在系统启动时就创建了,否则就谈不上数据共享了。
这就要求在AndroidManifest.XML中使用<provider>元素明确定义。
2. 可能会有多个程序同时通过ContentResolver访问一个ContentProvider,会不会导致像数据库那样的“脏数据”?这个问题一方面需要数据库访问的同步,尤其是数据写入的同步,在AndroidManifest.XML中定义ContentProvider的时候,需要考虑是<provider>元素multiprocess属性的值;另外一方面Android在ContentResolver中提供了notifyChange()接口,在数据改变时会通知其他ContentObserver,这个地方应该使用了观察者模式,在ContentResolver中应该有一些类似register,unregister的接口。
三、使用现成的ContentProvider下面我们就来看看代码,我们是怎么利用到现成的ContentProvider。
packageeoe.android.Demo;importandroid.app.Activity;importandroid.content.ContentResolver;importandroid.content.ContentValues;importandroid.database.Cursor;.Uri;importandroid.os.Bundle;importandroid.provider.ContactsContract;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.Toast;publicclassMainContentProviderextendsActivity{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(yout.main);Buttonb1=(Button)findViewById(R.id.Button01);OnClickListenerocl=newOnClickListener(){@OverridepublicvoidonClick(Viewv){ContentResolvercontentResolver=getContentResolver();//获得所有的联系人Cursorcursor=contentResolver.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);//循环遍历if(cursor.moveToFirst()){intidColumn=cursor.getColumnIndex(ContactsContract.Contacts._ID);intdisplayNameColumn=cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);do{//获得联系人的ID号StringcontactId=cursor.getString(idColumn);//获得联系人姓名StringdisPlayName=cursor.getString(displayNameColumn);Toast.makeText(MainContentProvider.this,"联系人姓名:"+disPlayName,Toast.LENGTH_LONG).show();//查看该联系人有多少个电话号码。
Android数据共享之ContentProvider总结

Content Provider由上一节内容,我们了解到Adroid的数据都是私有的,那么对于像通讯录之类,多个APP(拨号、通话、短消息…)都需要共享使用,该怎么实现呢?答案就是ContentProvider。
概述:ContentProvider是Android平台中,在不同应用程序之间实现数据共享的一种机制。
一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制。
并且此种方式忽略了底层的数据存储实现,ContentProvider提供了一种统一的通过Uri实现数据操作的方式。
Android为常用的数据类型(图片,音视频,通讯录)提供了大量的ContentProvider,它们被定义在android.provider包下面。
操作模型:ContentProvider类:定义在android.content包下面,主要数据存取类,提供了常用的数据操作接口•delete(): 删除数据集•insert():添加数据集•qurey():查询数据集•update():更新数据集•onCreate():初始化底层数据集和建立数据连接等工作•getType():返回指定URI的MIME数据类型,ContentResolver类:ContentProvider是实际操作数据库的方法,客户端通过ContentResolver实现,ContentResolver和ContentProvider提供了对应的方法,诸如insert(), delete(), query()和update()之类的方法。
我们间接的通过ContentResolver的方法来操作ContentProvider。
Uri介绍ContentProvider 通过URI对象共享数据;Uri代表了要操作的数据,Uri主要包含了两部分信息:1》需要操作的ContentProvider2》对ContentProvider中的什么数据进行操作Uri是一个通用资源标志符,将其分为A,B,C,D 4个部分:A:无法改变的标准前缀,包括;"content://"、"tel://"等。
android四大组件--ContentProvider详解

android四大组件--ContentProvider详解一、相关ContentProvider概念解析:1、ContentProvider简介在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences、网络存储、文件存储、外储存储、SQLite。
但是我们知道一般这些存储都只是在单独的一个应用程序之中达到一个数据的共享,有时候我们需要操作其他应用程序的一些数据,例如我们需要操作系统里的媒体库、通讯录等,这时我们就可能通过ContentProvider来满足我们的需求了。
2、为什么要选择ContentProvider?ContentProvider向我们提供了我们在应用程序之前共享数据的一种机制,而我们知道每一个应用程序都是运行在不同的应用程序的,数据和文件在不同应用程序之间达到数据的共享不是没有可能,而是显得比较复杂,而正好Android中的ContentProvider则达到了这一需求,比如有时候我们需要操作手机里的联系人,手机里的多媒体等一些信息,我们都可以用到这个ContentProvider来达到我们所需。
1)、ContentProvider为存储和获取数据提供了统一的接口。
ContentProvide 对数据进行封装,不用关心数据存储的细节。
使用表的形式来组织数据。
2)、使用ContentProvider可以在不同的应用程序之间共享数据。
3)、Android为常见的一些数据提供了默认的ContentProvider(包括音频、视频、图片和通讯录等)。
总的来说使用ContentProvider对外共享数据的好处是统一了数据的访问方式。
3、Uri介绍为系统的每一个资源给其一个名字,比方说通话记录。
1)、每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。
2)、Android所提供的ContentProvider都存放在android.provider包中。
ContentProvider详解

ContentProvider详解⼏个概念:Cursor、 Content provider 、 Uri 、contentresolver1、Cursor :个⼈理解为数据库中的⼀⾏数据,它是每⾏数据的集合。
它是⼀个类。
通过它的⼀系列⽅法,我们可以对数据库中的每⾏进⾏定位,我们还可以知道每⼀列的信息。
⽐如:cursor(游标).moveToFirst(),表⽰定位到第⼀⾏,然后我们通过其他⽅法可以知道每列的名称,每列的数据类型等。
2、Content Provider :内容提供者,我们⼀个application中的其他类假如想操作数据库中的数据的话,就可以直接对此进⾏操作,⽽避免了对数据库进⾏直接操作,再说了,数据库这些个东西有权限要求的,我们不可能把数据库直接暴露出来,所以,通常采⽤这种形式。
其实他就是⼀个提供数据访问的⽹站,我们要访问它的话,就得知道他的域名。
android:authorities . 在minifest.xml中配置如下:(包含两个部分,name 与 anthorities)<provider android:name=".PersonProvider" android:authorities="com.sharpandroid.providers.personprovider"/>当某个应⽤,可能是外部的,可以通过这两个属性来找到这个Content Provider了。
Content Provider ⽀持在多个应⽤中存储和读取数据。
这也是跨应⽤共享数据的唯⼀⽅式。
在android系统中,没有⼀个公共的内存区域,供多个应⽤共享存储数据。
3、Uri:这个东西就是提供者提供数据的详细地址,到底是哪些数据,⽤此来对数据进⾏过滤操作。
假如说,Content Provider是⼀个DNS,域名的话。
那么Uri可以认为是IP地址,我们通过此IP地址找到我们所需要的数据。
Android四大组件 之ContentProvider

获得系统的CP 的数据
• Android系统中会给应用提供一些开放的系统数据,当然 它是采用CP的这种形式。 • 通过ContentResolver访问系统CP的步骤: – 调用Activity的ContentResolver获取CR对象 – 调用CR中的insert,delete,update,query方法获得系 统CP提供的数据
URI
例如以下是系统的一些 URI: content://media/internal/images (该 URI 返回设备上存储的所有图片)
content://contacts/people/5 (联系人信息中 ID 为 5 的联系人记录)
content://contacts/people (该 URI 返回设备上的所有联系人信息)
• 注意:
– 要获得系统CP提供的数据,必须要了解该CP的Uri。
使用CP 管理联系人
• Android系统中Contacts应用来管理联系人,而且暴露相 应CP。 • 此CP支持的Uri如下: – ContactsContract.Contacts.CONTENT_URI :管理联系 人的Uri – monDataKinds.Phone.CONTENT_ URI:管理联系人的电话的Uri – monDataKinds.Email.CONTENT_ URI:管理联系人的Email的Uri
2)、parseId(uri)//用于从指定uri中解析出所包含的id的值
Uri uri = Uri.parse("content://com.yfz.Lesson/people/10") long personid = ContentUris.parseId(uri); 最后personid 为 :10
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/s/blog_49f62c350101hhhl.html
Android四大组件是Activity, Service, Content Provider, Broadcast Receiver。
Activity作为程序界面,直接与用户交互
Service运行在后台,没有界面,完成特定的功能
ContentProvider维护应用数据,方便应用本身或其它应用访问
Broadcast Receiver提供异步广播消息接收机制,便于各应用/组件进行交互
通过AndroidManifest.xml, 可以看到一个应用使用了哪些组件:
attribute的定义可以参考
/guide/topics/manifest/manifest-intro.html 下面重点探讨Content Provider的实现和使用。
二.什么是ContentProvider
Content Provider维护特定的应用数据,并可以让其它应用轻松访问该数据。
对数据使
用者来说它是数据提供者。
它提供统一的接口对数据进行操作,使用者不用关心数据到底是如何存储的以及数据类型到底是什么。
也就是说,Content Provider作为数据提供者,提供了对外共享本地数据一种机制,使Android应用能方便地基于该机制进行数据访问。
为了便于管理和访问,每个Content Provider必须有唯一标示,用Uri表示。
Uri 类似http url, 构成如下:
content://authority/path
所有Content Provider的Uri必须以content://开头,这是Android规定的。
authority是个字符串,它由开发者自己定义,用于来唯一标示一个ContentProvider。
系统会根据这个标示查找ContentProvider。
path也是字符串,表示要操作的数据。
可根据自己的实现逻辑来指定:content://contacts/people表示要操作ContentProvider为contacts下的people表content://com.android.contacts/people/#表示要操作表people中特定id的行(记录)。
content://downloads/download/10/name表示要操作id为10的行的name字段。
content://downloads/download/*表示操作download表中的所有字段。
总之,#匹配一个数字字符串,*匹配一个文本字符串。
可以看出, 实现一个自定义的Content Provider,要基于系统提供的基类ContentProvider,需要实现6个接口。
大部分接口就是类似数据库的数据操作接口,实际上Content Provider是需要创建数据库并对数据库进行操作的。
完成实现之后,在
Androidmanifest.xml中声明自己的Content Provider以及与Provider相关的permission 声明(可以没有permission定义)。
例如:
使用非常简单,Android提供了Context级别的ContentResolver对象来对Content Provider 进行操作。
正是因为有了ContentResolver,使用者才不用关心Provider到底是哪个应用或哪个类实现的。
只要知道它的uri就能访问。
ContentResolver对象存在于每个Context 中。
几乎所有对象都有自己的Context。
四.ContentProvider内部机制
1.ContentProvider接口调用过程
ContentProvider依赖
ContentResolver/ActivityThread/ActivityManagerService对外提供
服务。
虽然ContentProvider的用法以及表现形式不是一个Service,实际上它可以看作是ActivityManagerService提供的一种服务, 它实现了IBinder接口。
首先调用者通过特定uri调用特定ContentProvider的接口函数,比如
insert(), 此时ContentResolver会通过uri获取特定ContentProvider的实例,ActivityThread检查本地Cache,如果发现此ContentProvider已经被引用过,则直接直接取出ContentProvider返回给调用者。
如果没有发现,由于ContentProvider可能已经被load了,可能还没有load;可能要创建Process,可能要检查permission,所以ActivityThread调用到ActivityManagerService来进行相关处理/检查。
如果该Provider 是Single Process,ActivityManagerService会为ContentProvider创建一个独立Process;如果是MultiProcess,说明每个调用者可以拥有独立的ContentProvider实例,于是ActivityManagerService只是返回ContentProvider的相关信息给ActivityThread,由ActivityThread负责ContentProvider的实例化,此时ContentProvider运行在调用者Process中。
实例化后,IConentProvider会返回给调用者,通过该接口可以调用所需功能。
ActivityThread本地维护一个mProviderMap <ProviderName, ProviderRecord >,记录已被引用的ContentProvider, 同时使用引用计数mProviderRefCountMap <IBinder, ProviderRefCount>记录特定ContentProvider的引用情况。
2.ContentProvider实例创建过程
ContentProvider实例的创建与multiprocess属性有关系(Androidmanifest.xml里指定),个人认为理解成多进程并不准确。
应该理解为ContentProvider的多实例,不会存在多个ContentProvider进程的情况,ContentProvider 可能存在多个实例。
1)对于android:multiprocess=true的ContentProvider,意味着可以多实例,那么由调用者在自己的进程空间实例化一个ContentProvider对象,此时定义
ContentProvider的App可能并没有启动。