一、ContentProvider内容提供者.是是android中一个应用向第三方共享数据的方式,android中的联系人,sms(短信记录)等都是通过这一方式来向外提供的

  1、使用:

    在应用中使用ContentProvider提供的数据并不是直接使用的,而是需要通过ContentResolver来实现的,ContentResolver中包含query/insert/delete/update等方法用于操作数据,但其内部就是调用ContentProvider的实现类来真正操作的。

使用ContentProvider获取sms数据的例子

  上面的使用过程分三步:

  ①指定访问URI,

  ②通过getContentResolver()获取ContentResolver对象,然后进行增删改查操作

  ③对获取数据/结果进行处理。

  上面是简述,下面对其中使用的内容进行详细说明:

    ①、URI:最早使用到的地方就是在Intent进行匹配的时候,其实这时的URI是和data向匹配的:

content://  com.example.project   :200      /folder/subfolder/etc
\---------/  \---------------------------/ \---/ \--------------------------/
scheme                 host                   port        path
                \--------------------------------/
                          authority

  现在大家应该知道data flag中那些属性的含义了吧,看下data flag
  <data android:host="string"
        android:mimeType="string"
        android:path="string"
        android:pathPattern="string"
        android:pathPrefix="string"
        android:port="string"
        android:scheme="string" />

  在使用ContentProvider时对URI有一个要求:就是其scheme必须是content,原因见2.

  注意:关于匹配ContentProvider的URI规则见自定义ContentProvider部分。

  ②、以query()为例,ContentResolver对象最终会调用的方法的源码见下

ContentResolver源码

  其中可以看到第一步是检测传入的uri是否为空,第二部就是对传入uri的scheme进行检测,判断其是否为content

cquireUnstableProvider源码(检测uri的scheme)

  同时可以看到是调用了ContentProvider对象进行真正的查询操作。这样做是为了简化对ContentProvider的操作,和进行安全检测等。

  ③、增删查改中最重要的就是查询的结果即Cursor的处理。Cursor就是一个数据的集合,可以获取某一行然后读取其中的数据。该类是一个接口类。

  2、自定义ContentProvider:这是自己项目对外提供数据的一种方式,最好的方式就是以android提供的范本进行创建,这里参考的是android的sample:notepad。这个项目中有3个文件比较重要,详细说明:

  1、NodePad.java:这个类中定义了一些与访问有关的属性,例如URI,列的名字等。这个类要和ContentProvider配合使用。

NotePad.java

  2、NotePadProvider.java:这个类就是自定义的ContentProvider,需要继承ContentProvider类并至少实现增删改查方法还有构造方法。在这个例子中,可以看到使用了以下几个类:

  ①DatabaseHelper:一个数据库帮助类,继承自SQLiteOpenHelper。

DatabaseHelper源码

  ②UriMatcher:这个对象的作用是用来指定匹配该ContentProvider的URI的匹配规则。

UriMatcher部分源码

  ③SQLiteQueryBuilder:该类是用来构建查询语句的。

  3、AndroidManifest.xml:这里需要注意的是清单文件中provider声明的部分

清单文件

  其中比较重要的是android:authorities和权限的声明,其实ContentProvider有非常复杂的权限管理,详见:http://iwillbemyself.blog.163.com/blog/static/1702232282012115104056917/,

  对于自定义ContentProvider还有一点比较重要的就是当操作的数据库有所改变时,应该通知相应的ContentObserver(内容观察者)进行处理。

二、BroadcastReceiver广播接收者,广播是Android中传递事件的方式,有两个方面:广播发送者和广播接收者。

1、广播发送者可以发送两种广播:同步广播有序广播,两者的区别是

  ①接收顺序的区别:同步广播同步接收,有序广播可以通过指定优先级来设置接收顺序

  ②是否可以中断的区别:由于有序广播有顺序,才有可能将广播进行中断,不让后来者进行接收;而同步广播则不能中断。

2、广播接收者:广播发送的具体内容就是一个隐式意图对象(因为通常是给另外的应用使用的),接收者通过两步来实现

  ①在清单文件中进行配置,

  ②继承BroadcastReceiver对象,并重写onReceive方法,在其中实现功能即可。

有序广播通过指定优先级来确定接收顺序,优先级从-1000~1000,

  ①如果同一个应用中的优先级相同,则在清单文件中前面的先接收

  ②如果不同应用中的优先级相同,则先安装的应用先接收

参考:http://blog.csdn.net/xiazdong/article/details/7768807

http://www.runoob.com/w3cnote/android-tutorial-broadcastreceiver.html

android学习笔记五。2、其他组件的更多相关文章

  1. Android学习笔记五:四大组件(转)

    转自:http://blog.csdn.net/shenggaofei/article/details/52450668 Android四大组件分别为activity.service.content ...

  2. Android学习笔记:使用ViewPager组件实现图片切换

    在很多App中,尤其是第一次安装启动后,都会出现几个图片进行一些app的介绍和说明,图片可以随着滑动而切换. 我们这里利用 ViewPager组件来演示如何实现这一点. 1.创建一个app工程,默认创 ...

  3. [Android学习笔记4]四大应用组件之一:Service 上

    一.什么是Service 一个Service就是一个能够在后台执行长时操作的应用程序组件,并且不提供用户界面.一个应用程序组件能够启动一个Service,即使用户切换到另一个应用程序,这个Servic ...

  4. Android学习笔记 ImageSwitcher图片切换组件的使用

    activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  5. Android学习笔记 Toast屏幕提示组件的使用方法

    activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  6. Android学习笔记(24):进度条组件ProgressBar及其子类

    ProgressBar作为进度条组件使用,它还派生了SeekBar(拖动条)和RatingBar(星级评分条). ProgressBar支持的XML属性: Attribute Name Related ...

  7. android学习笔记五。1、Service深入学习

    一.Service,服务是没有界面而在后台长期运行的程序,可以看做是后台的Activity. 1.在Android中按返回键退出一个应用并不会(内存充足时)直接销毁一个进程,所以其中的子线程也可以在后 ...

  8. android学习笔记五——AutoCompleteTextView

    AutocompleteTextview ==> 使用比较容易,只需要为其设置一个Adapter,该Adapter封装其需要预设的文本内容. 如下所示实例: <RelativeLayout ...

  9. android学习笔记五

    Android中的category大全 Api Level 3(SDK 1.5)和Api Level 4(SDK 1.6): android.intent.category.ALTERNATIVE a ...

随机推荐

  1. 阿里云部署java项目

    第一步:注册阿里云账号(如果有请看第二步) 1.百度搜索阿里云,点击进入阿里云官网 2.点击右上角免费注册 3.进入注册页面,按照要求填写信息 4.注册完成后登陆 登陆之后首先购买阿里云esc与服务器 ...

  2. setjmp()和longjmp()函数

    之前我们讲到了过程活动记录(AR),那么如何来操纵AR呢,一个可能的方法是,根据局部变量的地址进行推算,例如对于上面的a函数,执行a函数时的当前AR地址就是参数i的地址偏移8个字节,也就是 ((cha ...

  3. ASP.NET-文件上传代码

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  4. POJ——T3259 Wormholes

    http://poj.org/problem?id=3259 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 50692   ...

  5. 【LeetCode】Merge Intervals 题解 利用Comparator进行排序

    题目链接Merge Intervals /** * Definition for an interval. * public class Interval { * int start; * int e ...

  6. mysql-联结

    一.联结 联结是利用SQL的select能执行的最重要的操作. 1.关系表:假如有一个包含产品目录的数据库表,其中每个类别的物品占一行.对于每种物品要求存储的信息包括产品描述和价格,以及生产该产品的供 ...

  7. EJB3.0高速入门项目开发步骤

    EJB3.0开发步骤 1.   开发环境 IDE开发工具:Eclipse Java EE IDE for Web Developers EJB容器:jboss-4.2.3.GA 后台数据库:MysQL ...

  8. 如何将网站升级为HTTPS协议(整理)

    如何将网站升级为HTTPS协议(整理) 一.总结 一句话总结: 获取证书(有免费有付费):证书是一个二进制文件,里面包含经过认证的网站公钥和一些元数据,要从经销商购买. 安装证书:证书可以放在/etc ...

  9. 利用Matlab自带的深度学习工具进行车辆区域检测与车型识别【Github更新!!!】(三)

    前言 对前面的东西更新了一下.地方包括: 1.GUI的更新,更友好的用户界面 2.支持用手直接画车辆区域,并且识别出来 3.将proposal.detect.fine-grained classifi ...

  10. rest_framework_HyperlinkedIdentityField

    #生成链接 HyperlinkedIdentityField class UserInfoSerializer(serializers.ModelSerializer): group = serial ...