android四大组件--ContentProvider详解
- 格式:docx
- 大小:74.16 KB
- 文档页数:19
android开发面试题目在进行Android开发面试前,我们需要对一些常见的面试题目进行准备,以提升自己的面试表现。
以下是一些常见的Android开发面试题目,供参考。
1. 介绍一下Android的四大组件?Android的四大组件分别是Activity、Service、Broadcast Receiver和Content Provider。
- Activity用于构建用户界面,处理用户交互,一个应用程序通常包含多个Activity。
- Service是一种后台运行的组件,用于执行长时间运行的操作,不与用户界面进行交互。
- Broadcast Receiver用于接收系统或其他应用程序发出的广播消息,并做出相应的处理。
- Content Provider用于管理应用程序的数据,并提供对外部应用程序的访问权限。
2. 什么是Manifest文件?它的作用是什么?Manifest文件是每个Android应用程序必须具备的一个XML文件,位于应用程序的根目录。
它记录了应用程序的各种配置信息,包括应用程序的包名、权限声明、组件声明等。
Manifest文件的作用是向系统描述应用程序的结构和组件,系统通过解析Manifest文件来了解应用程序并进行相应的操作,如启动Activity、分配权限等。
3. 什么是Intent?它的作用是什么?Intent是Android应用程序之间进行通信的一种机制。
它分为两种类型:显式Intent和隐式Intent。
- 显式Intent用于指定明确的目标组件,用于在应用程序内部进行页面跳转。
- 隐式Intent没有明确指定目标组件,通过设置相应的过滤条件来匹配合适的组件,可用于跳转到其他应用程序的页面或请求系统提供特定的服务。
Intent的作用是触发组件之间的交互,并且可以使用Intent传递数据、启动Activity、启动Service、发起Broadcast等。
4. 什么是Activity生命周期?请介绍各个生命周期方法。
安卓的四⼤组件Android四⼤基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver⼴播接收器。
⼀:了解四⼤基本组件Activity :应⽤程序中,⼀个Activity通常就是⼀个单独的屏幕,它上⾯可以显⽰⼀些控件也可以监听并处理⽤户的事件做出响应。
Activity之间通过Intent进⾏通信。
在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据。
典型的动作类型有:M AIN(activity的门户)、VIEW、PICK、EDIT 等。
⽽动作对应的数据则以URI 的形式进⾏表⽰。
例如:要查看⼀个⼈的联系⽅式,你需要创建⼀个动作类型为VIEW 的intent,以及⼀个表⽰这个⼈的URI。
与之有关系的⼀个类叫IntentFilter。
相对于intent 是⼀个有效的做某事的请求,⼀个intentfilter 则⽤于描述⼀个activity(或者IntentReceiver)能够操作哪些intent。
⼀个activity 如果要显⽰⼀个⼈的联系⽅式时,需要声明⼀个IntentFilter,这个IntentFilter 要知道怎么去处理VIEW 动作和表⽰⼀个⼈的URI。
IntentFilter 需要在AndroidManifest.xml 中定义。
通过解析各种intent,从⼀个屏幕导航到另⼀个屏幕是很简单的。
当向前导航时,activity 将会调⽤startActivity(Intent myIntent)⽅法。
然后,系统会在所有安装的应⽤程序中定义的IntentFilter 中查找,找到最匹配myIntent 的Intent 对应的activity。
新的activity 接收到myIntent 的通知后,开始运⾏。
当startActivity ⽅法被调⽤将触发解析myIntent 的动作,这个机制提供了两个关键好处:A、Activities 能够重复利⽤从其它组件中以Intent 的形式产⽣的⼀个请求;B、Activities 可以在任何时候被⼀个具有相同IntentFilter 的新的Activity 取代。
androidmanifest的provider用法在Android开发中,<provider>元素用于在AndroidManifest.xml文件中声明一个Content Provider。
Content Provider是Android系统中共享数据的一种标准方式,它允许一个应用程序访问另一个应用程序中的数据,同时保持数据的封装性和安全性。
使用<provider>标签时,需要指定以下属性:1.authorities:这是一个字符串数组,定义了Content Provider的唯一标识。
这个标识通常以URI的形式表示,如"com.example.myapp.provider"。
:指定Content Provider的实现类的全限定名。
3.exported:布尔值,指示Content Provider是否可以被其他应用程序访问。
如果设置为true,则表示Content Provider可以被其他应用访问;如果为false,则只有同一个应用或具有相同用户ID的应用可以访问。
4.grantUriPermissions:布尔值,指示是否授予临时权限给调用者,以便它们可以对ContentProvider提供的数据执行读/写操作。
5.pathPattern 和pathPrefix:这些属性用于限制哪些路径可以通过Content Provider暴露出去。
6.readPermission 和writePermission:定义了访问Content Provider所需的权限。
7.meta-data:用于传递额外的信息给Content Provider。
例如,如果要在AndroidManifest.xml中声明一个FileProvider,可以按照以下步骤操作:1.在manifest中使用<provider>标签来指定FileProvider。
2.指定有效的文件路径,以便FileProvider可以为文件生成对应的Content URI。
android四大组件知识点Android开发中,四大组件是Android系统的核心特性之一。
每个组件都有它自己的功能,但是它们都能够相互配合,实现丰富多彩的应用程序。
在本文中,我们将会介绍Android四大组件的知识点。
1. ActivityActivity是Android中最常用的一个组件,它是用户界面的窗口,负责与用户进行交互。
一个应用程序通常由多个Activity组成,每个Activity都是一个独立的界面。
2. ServiceService是一个后台运行的组件,可以在没有用户界面的情况下执行一些任务,例如播放音乐、下载文件等。
Service还可以与Activity进行通信,通过Intent来传递数据。
3. BroadcastReceiverBroadcastReceiver是一种接收广播消息的组件,它可以接收来自系统或其他应用程序的广播消息,并且可以执行一些操作,例如更新UI界面、发送通知等。
BroadcastReceiver还可以向其他应用程序发送广播消息,实现应用程序间的通信。
4. ContentProviderContentProvider是一个数据访问的组件,可以访问应用程序的数据,并且可以与其他应用程序共享数据。
ContentProvider通常用于存储应用程序的数据,例如联系人、短信、日历等。
在Android开发中,四大组件都有其独特的用途,但是它们也可以相互配合,实现更强大的功能。
例如,Activity可以启动Service,在Service中执行一些任务,然后将结果返回给Activity;BroadcastReceiver可以接收来自Service的广播消息,更新UI界面等。
因此,熟悉四大组件的知识点对于开发高质量的Android应用程序非常重要。
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,并重写相应的方法。
Android开发四⼤组件概述这个⽂章主要是讲Android开发的四⼤组件,本⽂主要分为⼀、Activity具体解释⼆、Service具体解释三、Broadcast Receiver具体解释四、Content Provider具体解释外加⼀个重要组件 intent的具体解释。
(主要来⾃于⽹络)1、Activity⼀个Activity通常展现为⼀个可视化的⽤户界⾯。
⽐如,⼀个activity可能展现为⼀个⽤户能够选择的菜单项列表或者展现⼀些图⽚以及图⽚的标题。
⼀个消息服务应⽤程序可能包括⼀个显⽰联系⼈列表的activity,⼀个编写信息的activity,以及其他⼀些查看信息和改动应⽤程序设置的activity。
尽管这些activity⼀起⼯作,共同组成了⼀个应⽤程序,但每个activity都是相对独⽴的。
每个activity都是Activity(android.app.Activity)的⼦类。
⼀个应⽤程序可能仅仅包括⼀个activity,或者像上⾯提到的消息服务程序⼀样有多个activity。
⼀个应⽤程序包括⼏个activity以及各个activity完毕什么样的功能全然取决于应⽤程序以及它的设计。
通常每⼀个应⽤程序都包括⼀个在应⽤程序启动后第⼀个展现给⽤户的 activity。
在当前展现给⽤户的activity中启动⼀个新的activity,能够实现从⼀个activity转换到另外⼀个 activity。
每⼀个activity都会有⼀个⽤于绘制⽤户界⾯的窗体。
通常这样⼀个窗体会填充整个屏幕,当然这个窗体也能够⽐屏幕⼩并漂浮在其它窗体之上。
activity还能够使⽤⼀些额外的窗体,⽐如⼀个要求⽤户响应的弹出式对话框,或者是当⽤户在屏幕上选择⼀个条⽬后向⽤户展现⼀些重要信息的窗体。
展⽰activity窗体的可视化内容区域是⼀些具有层次关系(⾮常像数据结构中的树)的视图,⽽视图则是由类View的⼦类表⽰的。
Android13_IPC⽅式之ContentProviderContentProvider是安卓提供的专门⽤于不同应⽤间进⾏数据共享的⽅式;它天⽣适合进程间通信;和Messenger⼀样,ContentProvider的底层实现同样也是Binder;ContentProvider还是四⼤组件之⼀;其实ContentProvider的使⽤涉及的细节还是很多的;⼀般来讲ContentProvider⽤于对应⽤的数据库进⾏增删改查;我们可以访问跨应⽤地其他应⽤提供的ContentProvider,也可以⾃定义⼀个ContentProvider;⾃⼰实现ContentProvider要⾃定义⼀个类继承⾃ContentProvider并实现六个抽象⽅法:onCreate、query、update、insert、delete、getType;1、⾸先在Manifest中注册ContentProvider组件:android:autorities 是作为标识,⼀般⽤完整包名加类名android:permission 表⽰权限,其他应⽤想要⽤这个ContentProvider时,继续声明该权限才可以,否则外界应⽤会异常终⽌;android:process 这⾥为了演⽰⽅便,直接在同⼀个应⽤中开启多进程模式,MainActivity⼀个进程,ContentProvider⼀个进程;2、编写DbOpenHelper类这个类⽤于管理数据的创建、升级、降级package com.example.learncontentprovider;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.util.Log;//利⽤SQLiteHelper来管理数据库的创建、升级、降级public class DbOpenHelper extends SQLiteOpenHelper {private static final String TAG = "DbOpenHelper";private static final String DB_NAME = "book_provider.db";public static final String BOOK_TABLE_NAME="book";public static final String USER_TABLE_NAME="user";private static final int DB_VERSION = 1;//建表语句图书和⽤户信息表private String CREATE_BOOK_TABLE = "CREATE TABLE IF NOT EXISTS "+BOOK_TABLE_NAME+"(_id INTEGER PRIMARY KEY,"+"name TEXT)";private String CREATE_USER_TABLE="CREATE TABLE IF NOT EXISTS "+USER_TABLE_NAME+"(_id INTEGER PRIMARY KEY,"+"name TEXT,"+"sex INT)";public DbOpenHelper(Context context){super(context,DB_NAME,null,DB_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {Log.d(TAG,"onCreate");db.execSQL(CREATE_BOOK_TABLE);db.execSQL(CREATE_USER_TABLE);}//⽤于对数据库进⾏升级的,是否执⾏该⽅法要看DbOpenHelper构造函数传⼊的version是否⽐之前更⼤。
contentprovide用法ContentProvide是Android平台上的一个组件,用于为应用程序提供数据访问的能力。
在本文中,将逐步回答关于ContentProvide的使用方法。
第一步:了解ContentProvider的基本概念和作用ContentProvider是Android中提供数据访问的组件之一,它允许应用程序共享和访问数据,从而实现多个应用程序之间的数据共享。
ContentProvider提供了一种标准化的方式来访问和管理数据,使得应用程序可以通过URI(Uniform Resource Identifier)来查询、插入、更新和删除数据。
第二步:创建一个ContentProvider类要使用ContentProvider,首先需要创建一个继承自android.content.ContentProvider类的自定义ContentProvider类。
这个类负责处理数据的访问请求,并提供数据给其他应用程序。
第三步:实现ContentProvider的必要方法自定义ContentProvider类需要实现以下几个重要的方法:- onCreate():在ContentProvider被创建时调用,用于初始化一些资源和数据库的连接。
- query():用于处理查询数据库的请求,并返回查询结果。
- insert():用于处理向数据库中插入数据的请求,并返回插入的URI。
- update():用于处理更新数据库的请求,并返回更新的行数。
- delete():用于处理删除数据库记录的请求,并返回删除的行数。
- getType():根据URI返回相应的数据类型。
第四步:在AndroidManifest.xml文件中注册ContentProvider在使用ContentProvider之前,需要在AndroidManifest.xml文件中对其进行注册。
使用<provider>元素进行注册,指定自定义ContentProvider类的名称、权限和数据访问URI。
contentprovider的实现原理ContentProvider是Android中的四大组件之一,可以帮助应用程序共享数据,是Android中的数据持久化机制。
ContentProvider是实现Android中数据的共享的基本方式,主要用于支持、管理应用程序中的数据访问和共享。
ContentProvider采用Android中所谓的MVC(M是Model,V是View,C是Controller)来设计,即将数据和控制逻辑分离,让数据能够独立于控制逻辑进行操作。
ContentProvider的实现原理:1. 继承ContentProvider类并重写对应的方法创建ContentProvider只需要继承ContentProvider类并重写对应的方法,其中最为核心的是query()、insert()、update()和delete()方法。
这些方法支持对外提供数据访问的接口。
2. 在AndroidManifest.xml文件中注册ContentProvider在AndroidManifest.xml文件中注册ContentProvider,让系统知道这个ContentProvider的存在,同时也可以指定ContentProvider 的权限。
3. 访问ContentProvider调用ContentResolver对象的方法,传入Uri参数访问ContentProvider提供的数据访问接口。
ContentProvider会接收到客户端应用程序的请求,根据请求的参数进行处理并返回相应的数据。
4. 数据库的连接ContentProvider的实现原理主要依赖于数据库的连接,因为ContentProvider的操作大多数情况下都是向数据库中插入、删除、查询、修改数据。
ContentProvider会通过ContentResolver对象来与数据源进行联系,ContentResolver通过调用ContentProvider的方法实现对数据的操作。
一、什么是contentproviderContentProvider是Android中的四大组件之一,用于管理应用程序的私有数据并提供对这些数据的访问权限。
通过ContentProvider,应用程序之间可以共享数据,并且可以实现数据的增删改查等操作。
二、ContentProvider的基本使用1. 创建ContentProvider要创建一个ContentProvider,需要继承自android.content.ContentProvider类,并实现其中的一些方法,包括onCreate(), query(), insert(), update(), delete()等方法。
在AndroidManifest.xml文件中需要注册ContentProvider,声明该Provider所管理的数据的URI。
2. 数据库操作在ContentProvider中,一般会使用SQLite数据库来存储数据。
在实现query(), insert(), update(), delete()等方法时,需要使用SQLiteOpenHelper来创建、打开、关闭数据库,并使用SQLiteDatabase对象进行数据的增删改查操作。
3. ContentResolver的使用在应用程序中,通过ContentResolver来访问ContentProvider提供的数据。
ContentResolver是一个用于访问ContentProvider的核心类,它可以通过ContentProvider所提供的URI来操作相应的数据。
4. 权限控制在ContentProvider中,可以通过权限控制来限制其他应用程序对数据的访问。
可以在AndroidManifest.xml中声明ContentProvider所需要的权限,并在ContentProvider的实现中对权限进行验证。
三、ContentProvider的使用示例下面以一个简单的学生信息管理系统为例,演示ContentProvider的基本使用。
"Content Provider"通常指的是在应用程序中提供和管理数据的组件。
在Android开发中,Content Providers是一种标准机制,允许不同的应用程序共享数据。
以下是一个简单的Content Provider 的例子:```javapublic class SimpleProvider extends ContentProvider {private static final String TAG = "SimpleProvider";private static final String DATABASE_NAME = "database.db";private static final int DATABASE_VERSION = 1;private static final String TABLE_NAME = "table";private static final String ID_COLUMN = "_id";private static final String VALUE_COLUMN = "value";private DBHelper dbHelper;@Overridepublic boolean onCreate() {dbHelper = new DBHelper(getContext());}@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {SQLiteDatabase db = dbHelper.getReadableDatabase(); String finalSelection = selection == null ? null : selection + " AND " + ID_COLUMN + " > ?";return db.query(TABLE_NAME, projection, finalSelection, selectionArgs, null, null, sortOrder);}@Overridepublic Uri insert(Uri uri, ContentValues values) {SQLiteDatabase db = dbHelper.getWritableDatabase(); long id = db.insert(TABLE_NAME, null, values);Uri newUri = ContentUris.withAppendedId(uri, id);getContext().getContentResolver().notifyChange(newUri, null);}@Overridepublic int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {SQLiteDatabase db = dbHelper.getWritableDatabase(); int count = db.update(TABLE_NAME, values, selection, selectionArgs);getContext().getContentResolver().notifyChange(uri, null);return count;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {SQLiteDatabase db = dbHelper.getWritableDatabase(); int count = db.delete(TABLE_NAME, selection, selectionArgs);getContext().getContentResolver().notifyChange(uri, null);}@Overridepublic String getType(Uri uri) {return null; // 这个方法在实际开发中可能不会被调用,但在实现时应该返回合适的MIME类型。
Android开发的基础知识点1.Android开发的四⼤组件:Activity:android应⽤程序上看到的⼀页。
Service:运⾏在后台,可以其他组件交互(⾳乐播放器)。
BroadcoastReceiver:⽤来对外部事件作响应(电话呼⼊)。
ContentProvider:对外提供资源,⼿机上各个APP之间进⾏资源共享。
2.Activity的⽣命周期:onCreate()——>onStart()——>onResume()——>onPause()——>onStop()——>onDestroy().Activity处于运⾏状态:启动⼀个Activity会调⽤:onCreate()——>onStart()——>onResume().Activity从后台回到前台,系统调⽤onRestart()——>onStart()——>onResume().。
当Activity后台不可见或者被覆盖掉了,内存不⾜被killed,能启动Activity。
Activty处于停⽌状态:Activity退居后台(跳转其他Activity或者按下home键回到主屏)会调⽤:onSavedInstanceState()(保存当前view组件的状态)——>onPause()——>onStop().Activity处于结束状态:当⽤户退出Activity时,系统调⽤onPause()——>onStop()——>onDestory()结束当前Activity。
3.Handler机制:Handler,Looper和MessageQueue三者直接的关系,就是,在Looper实例化的同时创建了与之⼀⼀对应的MessageQueue,必须有了Looper实例才能创建Handler。
在主线程中⾃带Looper实例,可以直接创建,⽽⼦线程中却不能,必须同过Looper.prepare()来创建唯⼀Looper实例。
androidprovider使⽤解析⼀、基本概念Android四⼤组件之⼀ content provider,它主要的作⽤是:实现各个应⽤程序之间的(跨应⽤)数据共享。
在这⾥涉及到进程通信问题,⾃然在Android中使⽤的是binder来进⾏,但是由于content provider提供的数据量⼀般都⽐较⼤不能够直接进⾏传递。
所以这⾥采⽤的是⼀种叫做匿名共享内存的⽅式进⾏数据传递,在不同的进程中只需要传递⼀个⽂件描述符就可以。
通过下图对content provider有个⽐较直观的了解:ContentProvider提供了在应⽤程序之前共享数据的⼀种机制。
1)存储和获取数据提供了统⼀的接⼝。
2)对数据进⾏封装,不⽤关⼼数据存储的细节。
3)Android为常见的⼀些数据提供了默认的ContentProvider(包括⾳频、视频、图⽚和通讯录等)。
⼆、content provider的定义如果需要使⽤content provider⾸先需要在AndroidManifest中进⾏申明<provider android:authorities="list"//该provider的唯⼀IDandroid:directBootAware=["true" | "false"]android:enabled=["true" | "false"] // 能否被系统实例化android:exported=["true" | "false"] //该provider能否被其他应⽤使⽤android:grantUriPermissions=["true" | "false"]android:icon="drawable resource"android:initOrder="integer"android:label="string resource"android:multiprocess=["true" | "false"]android:name="string"android:permission="string"android:process="string"android:readPermission="string"//读权限android:syncable=["true" | "false"]android:writePermission="string" > //写权限. . .</provider>注意在provider的属性中最重要的是 authorities,它是唯⼀能够标识⼀个provider,contentprovider通过URI中的地址来查找到对应的provider,其中该URI就包含了需要寻找的provider中的authorities属性值。
Android的四⼤组件Android的四⼤组件:Activity、Service、BroadcastReceiver、Content Provider。
Content Provider 属于Android应⽤程序的组件之⼀,作为应⽤程序之间唯⼀的共享数据的途径,Content Provider 主要的功能就是存储并检索数据以及向其他应⽤程序提供访问数据的接⼝① Activity是Android应⽤中负责与⽤户交互的组件——⼤致上把它想象成Swing编程中的JFrame控件。
不过它与JFrame的区别在于:JFrame本⾝可以设置布局管理器,不断地向JFrame中添加组件,但Activity只能通过setContentView(View)来显⽰指定组件。
Activity为Android应⽤提供⾥可视化⽤户界⾯,如果该Android应⽤需要多个⽤户界⾯,那么这个Android应⽤将会包含多个Activity,多个Activity组成Activity栈。
当前活动的Activity位于栈顶。
View组件是所有UI控件、容器控件的基类,View组件就是Android应⽤中⽤户实实在在看到的部分。
但View组件需要放到容器组件中,或者使⽤Activity将它显⽰出来。
如果需要通过某个Activity把指定View显⽰出来,调⽤Activity的setContentView()⽅法即可。
② Service与Activity的地位是并列的,它也代表⼀个单独的Android组件。
Service与Activity的区别在于:Service通常位于后台运⾏,它⼀般不需要与⽤户交互,因此Service组件没有图形⽤户界⾯。
Service组件需要继承Service基类。
⼀个Service组件被运⾏起来之后,它将拥有⾃⼰独⽴的⽣命周期,Service组件通常⽤于为其他组件提供后台服务或监控其他组件的运⾏状态。
③ BroadcastReceiver是Android应⽤中另⼀个重要的组件,BroadcastReceiver代表⼴播消息接收器。
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包中。
将其分为A,B,C,D 4个部分:A:标准前缀,用来说明一个Content Provider控制这些数据,无法改变的;"content://"B:URI 的标识,用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
它定义了是哪个Content Provider提供这些数据。
对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的类名。
这个标识在元素的 authorities属性中说明:一般是定义该ContentProvider的包.类的名称C:路径(path),通俗的讲就是你要操作的数据库中表的名字,或者你也可以自己定义,记得在使用的时候保持一致就可以了;"content://com.bing.provider.myprovider/tablename"D:如果URI中包含表示需要获取的记录的ID;则就返回该id对应的数据,如果没有ID,就表示返回全部;"content://com.bing.provider.myprovider/tablename/#" #表示数据id。
PS:路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:1、要操作person表中id为10的记录,可以构建这样的路径:/person/102、要操作person表中id为10的记录的name字段, person/10/name3、要操作person表中的所有记录,可以构建这样的路径:/person4、要操作xxx表中的记录,可以构建这样的路径:/xxx5、当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如下:要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name6、如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:Uriuri = Uri.parse("content://com.bing.provider.personprovider/person")4、UriMatcher类使用介绍因为Uri代表了要操作的数据,所以我们经常需要解析Uri,并从Uri中获取数据。
Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher和ContentUris 。
掌握它们的使用,会便于我们的开发工作。
UriMatcher类用于匹配Uri,它的用法如下:首先第一步把你需要匹配Uri路径全部给注册上,如下://常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);//如果match()方法匹配content://com.bing.procvide.personprovider/person路径,返回匹配码为1sMatcher.addURI("com.bing.procvide.personprovider", "person", 1);//添加需要匹配uri,如果匹配就会返回匹配码//如果match()方法匹配content://com.bing.provider.personprovider/person/230路径,返回匹配码为2sMatcher.addURI("com.bing.provider.personprovider", "person/#", 2);//#号为通配符switch (sMatcher.match(Uri.parse("content://com.ljq.provider.personprovider/person/10"))) { case 1break;case 2break;default://不匹配break;}注册完需要匹配的Uri后,就可以使用sMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配content://com.ljq.provider.personprovider/person路径,返回的匹配码为15、ContentUris类使用介绍ContentUris类用于操作Uri路径后面的ID部分,它有两个比较实用的方法:withAppendedId(uri, id)用于为路径加上ID部分:Uri uri = Uri.parse("content://com.bing.provider.personprovider/person") Uri resultUri = ContentUris.withAppendedId(uri, 10);//生成后的Uri为:content://com.bing.provider.personprovider/person/10parseId(uri)方法用于从路径中获取ID部分:Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person/10") long personid = ContentUris.parseId(uri);//获取的结果为:106、使用ContentProvider共享数据1)ContentProvider类主要方法的作用:public boolean onCreate():该方法在ContentProvider创建后就会被调用,Android开机后,ContentProvider在其它应用第一次访问它时才会被创建。
public Uri insert(Uri uri, ContentValues values):该方法用于供外部应用往ContentProvider添加数据。
public int delete(Uri uri, String selection, String[] selectionArgs):该方法用于供外部应用从ContentProvider删除数据。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs):该方法用于供外部应用更新ContentProvider中的数据。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):该方法用于供外部应用从ContentProvider 中获取数据。
public String getType(Uri uri):该方法用于返回当前Url所代表数据的MIME类型。
2)如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头,例如:要得到所有person记录的Uri为content://com.bing.provider.personprovider/person,那么返回的MIME类型字符串应该为:"vnd.android.cursor.dir/person"。
3)如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头,例如:得到id为10的person记录,Uri为content://com.bing.provider.personprovider/person/10,那么返回的MIME类型字符串为:"vnd.android.cursor.item/person"。
7、ContentResolver操作ContentProvider中的数据1)当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。
2)ContentResolver 类提供了与ContentProvider类相同签名的四个方法:public Uri insert(Uri uri, ContentValues values):该方法用于往ContentProvider添加数据。