北京pk10五码全天计划 pk10计划专家在线计划 赛车赌博是怎么回事 pk10输100万怎么上岸 怎么玩pk10才能赢钱 pk10赛车345678方案 北京pk10九码为什么输 北京pk10计划怎么倍投 pk10赛车冠军有规律 pk10最牛稳赚5码计划 pk10大小单双算法 玩pk10倾家荡产案例 pk10怎么翻倍最合理 pk10冠亚和在线计划 北京pk10十码刷水 北京pk10手机购买平台 北京pk10网赌 北京pk全天免费计划 北京pk10刷负盈利平台 北京pk10如何看大小 pk10买8码杀2码好方法 北京pk10全天一期计划 北京pk10网赌害人案例 北京pk赛车一天开几期 北京pk两期免费计划 北京pk9.99倍网站 北京pk赛车5码计划最准 网上赛车赌博犯法吗 北京pk拾计划在线计划 北京pk10技巧规律后8码

蒲公英联盟提供ghost win10,ghost win7,xp,装机纯净版,64位旗舰版,绿色软件,免费软件下载基地!

当前位置:主页 > 教程 > 服务器类 >

Android组件content provider如何使用

来源:蒲公英系统┆发布时间:2018-10-31 09:03┆点击:

Android四大组件之一 content provider,它主要的作用是:实现各个应用程序之间的(跨应用)数据共享。

在这里涉及到进程通信问题,自然在Android中使用的是binder来进行,但是由于content provider提供的数据量一般都比较大不能够直接进行传递。

所以这里采用的是一种叫做 匿名共享内存的方式进行数据传递,在不同的进程中只需要传递一个文件描述符就可以。

通过下图对content provider有个比?#29616;?#35266;的了解:

Android组件content provider如何使用 三联

ContentProvider提供了在应用程序之前共享数据的一种机制。
1)存储和获取数据提供了统一的接口。
2)对数据进行封装,不用关心数据存储的细节。
3)Android为常见的一些数据提供?#22235;?#35748;的ContentProvider(包括音频、视频、图片和通讯录等)。

二、content provider的定义

如果需要使用content provider首先需要在AndroidManifest中进行申明

<provider android:authorities="list" //该provider的唯一ID android: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属性值。
定义好的provider最后被打包编译进入到PackageManagerService中。

在Java代码中定义一个provider时需要继承其父类ContentProvider,并实现增删查改方法。

public class XXXXProvider extends ContentProvider { @Override public boolean onCreate() { // TODO Auto-generated method stub return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // TODO Auto-generated method stub return null; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } }

三、contentprovider的使用

在activity中如果想通过provider来实现增删查改,首先需要获取contentprovider,大致过程为在context中获取contentResolver,然后通过contentResolver去ActivityManagerService中查询对应的provider,如果没有则进入PackageManagerService中查找:

1)首先每个context类都会内部包含了一个ContentResolver的子对象ApplicationContentResolver。
2)通过调用ApplicationContentResolver的主要方法query来获取CP的数据库数据。
3)调用的过程首?#28982;?#35843;用ContentResolver的核心方法acquireProvider()。而acquireProvider()方法是一个抽象方法,其实现是交由子类实现。
4)通过子类的acquireProvider()方法实现了解到主要的实现是交由ActivityThread类来完成。
5)ActivityThread类会做出一个判断,如果本地保存一个需要获取的CP对象实例,就会直接返回这个对象实例,如果没有保存,则会访问AMS对象去查?#19968;?#21462;一个对象的CP对象实例,当找到这个对象实例后会保存到本地以便日后快速获取。
6)如果在AMS里面没有找到,就会继续深入到PMS里去从全部的provider中查找。
7)获取到CP对象实例后会通过层层返回,最后再调用该CP对象的query方法获取相应的数据。

首先在应用的的manifest中需要进行读写权限申明,这个申明的定义跟之前provider定义中读写所需权限属性值是一样的:

<use-permission android:name="android.permission.READ_SMS"/> <use-permission android:name="android.permission.WRITE_SMS"/>

在activity中获取ContentResolver调用其中的操作方法时,需要传入相对应的参数:

contentResolver.query(Uri uri, String[] projection,String selection, String[] selectionArgs,String orderBy);

uri:传入对应uri是为了查找到对应的provider,跟provider在manifest中定义的authorities值是一样

projection:选择需要返回的对象属性值,有时候不需要将对象的?#31561;?#37096;返回。

selection/selectionArgs: 查询条件

orderBy: 返回的对象排序方式

类似其他的delete、insert和update操作。最主要的是传入正确的Uri才能找到对应的provider。

尚未注册畅言帐号,请到后台注册
北京体彩赛车开奖结果