android provider 使用解析

一、基本概念

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的唯一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)调用的过程首先会调用ContentResolver的核心方法acquireProvider()。而acquireProvider()方法是一个抽象方法,其实现是交由子类实现。
4)通过子类的acquireProvider()方法实现了解到主要的实现是交由ActivityThread类来完成。
5)ActivityThread类会做出一个判断,如果本地保存一个需要获取的CP对象实例,就会直接返回这个对象实例,如果没有保存,则会访问AMS对象去查找获取一个对象的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:选择需要返回的对象属性值,有时候不需要将对象的值全部返回。

selection/selectionArgs: 查询条件

orderBy: 返回的对象排序方式

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

时间: 2024-11-02 23:30:00

android provider 使用解析的相关文章

Android ActionBar完全解析,使用官方推荐的最佳导航栏(下)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/25466665 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/guide/topics/ui/actionbar.html 限于篇幅的原因,在上篇文章中我们只学习了ActionBar基础部分的知识,那么本篇文章我们将接着上一章的内容继续学习,探究一下ActionBar

【Android开发精要笔记】Android组件模型解析

Android组件模型解析 Android中的Mashup 将应用切分成不同类别的组件,通过统一的定位模型和接口标准将他们整合在一起,来共同完成某项任务.在Android的Mashup模式下,每个组件的功能都可以被充分的复用.来自不同应用的组件可以有机地结合在一起,共同完成任务. 基于Mashup的Android应用模型 三个基本要素:组件.连接.配置 接口就是实现单元.从代码来看,组件就是派生自特定接口或基类的子类的实现,如界面组件Activity就是指派生自android.app.Activ

android源码解析之(十二)--&gt;系统启动并解析Manifest的流程

最近有同学问我关于Manifest何时被系统解析的问题,正好也分析到这一块了,索性这一章就讲解一下android系统何时解析Manifest吧,这里的Manifest指的是android安装文件apk中的androidManifest.xml文件是何时被解析的. 大家应该都知道,Android系统启动之后,我们就可以在一个应用中打开另一个从未打开过的应用,或者是在一个应用中发送广播,如果另外一个应用设置了这个广播的接收器,那么这个应用进程就会被启动并接收该广播并作出相应的处理,这样的例子很多,我

flutter android端 原理解析

首先看MainActivity, 继承FlutterActivity 再看FlutterActivity代码,继承Activity,实现Provider.PluginRegistry.ViewFactory 12345678910111213141516 private final FlutterActivityDelegate delegate = new FlutterActivityDelegate(this, this);private final FlutterActivityEven

Android Service完全解析,关于服务你所需知道的一切(下) (转载)

转自:http://blog.csdn.net/guolin_blog/article/details/9797169 转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在 上一篇文章中,我们学习了Android Service相关的许多重要内容,包括Service的基本用法.Service和Activity进行通信.Service的销毁方式. Service与Thread的关系.以及如何创建前台Service.以上

Android Service完全解析,关于服务你所需知道的一切(上)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了.Service作为Android四大组件之一,在每一个应用程序中都扮演着非常重要的角色.它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务.必要的时候我们甚至可以在程序退出的情况下,让Service在后台继续保持

Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/18234477 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/guide/topics/ui/actionbar.html Action Bar是一种新増的导航栏功能,在Android 3.0之后加入到系统的API当中,它标识了用户当前操作界面的位置,并提供了额外的用

Android Service完全解析,关于服务你所需知道的一切(下)

转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要内容,包括Service的基本用法.Service和Activity进行通信.Service的销毁方式.Service与Thread的关系.以及如何创建前台Service.以上所提到的这些知识点,基本上涵盖了大部分日常开发工作当中可能使用到的Service技术.不过关于Service其实还有一个更加

Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示

Android JSON原生解析的几种思路,以天气预报为例 今天项目中要实现一个天气的预览,加载的信息很多,字段也很多,所以理清了一下思路,准备独立出来写一个总结,这样对大家还是很有帮助的,老司机要开车了 涉及到网络,你就一定要先添加权限,准没错 <!--网络权限--> <uses-permission android:name="android.permission.INTERNET" /> 一.归属地查询(JSONObject) 这个也是最简单的一类Json