一、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. 斗地主算法的设计与实现(一)--项目介绍&如何定义和构造一张牌

    大学期间,我在别人的基础上,写了一个简易的斗地主程序. 主要实现了面向对象设计,洗牌.发牌.判断牌型.比较牌的大小.游戏规则等算法. 通过这个斗地主小项目的练习,提高了我的面向对象设计能力,加深了对算 ...

  2. 面向对象设计(OOD)七大原则

    这篇文章我会不停的维护它,它将会越来越长,但它是关于我在面向对象中的一些学习的思考心得.希望对自己对各位都能实用处.     开篇前,说明一下写这篇文章的原因.原因是由于设计模式.由于设计模式里的各种 ...

  3. _00020 妳那伊抹微笑_谁的异常最诡异第一期之 SqlServer RSA premaster secret error

    博文作者:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 博文标题:_00020 妳那伊抹微笑_谁的异常最诡异第一期之 SqlServer RSA premas ...

  4. vs输出窗口,显示build的时间

    https://stackoverflow.com/questions/82128/displaying-build-times-in-visual-studio Tools... Options.. ...

  5. Java数组与栈内存、堆内存

    package ch4; /** * Created by Jiqing on 2016/11/9. */ public class ArrayInRam { public static void m ...

  6. linux中的raid

    参考文档 http://www.cnblogs.com/ivictor/p/6099807.html 制作raid5 http://blog.51cto.com/11134648/2103384 RA ...

  7. spring-data-redis 使用过程中需要注意的地方

    1.序列化问题 <!-- SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略. StringRedisTemplate默认采用的是String的序列化策略 ...

  8. CUDA笔记12

    这几天配置了新环境,而且流量不够了就没写. 看到CSDN一个人写了些机器学习的笔记,于是引用一下http://blog.csdn.net/yc461515457/article/details/504 ...

  9. Git放弃本地更改恢复到资源库版本

    使用git版本控制工具在本地clone一份代码后,如果发现修改错误想恢复到资源库版本,下面两行可以轻松加愉快的搞定: git clean -xdf git checkout -f git的更多详细用法 ...

  10. shell call python

    python -c "import os; p=os.getcwd(); print(p);print(p);print(p);print('test over')"