一、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. CSS 清除浮动 伪类

    参考链接:https://www.cnblogs.com/yingsu/p/7261904.html 不清楚浮动的结果和影响不再描述,清除浮动的代码别处也有很多,每种方法都有十分简洁的代码,我今天学到 ...

  2. 紫书 习题 8-15 UVa 1617 (贪心)

    先排序, 然后每个线段先放右端点, 然后往下放, 如果不能放就整体往左移动, 当不能往左移动的时候就ans++ 开始下一个整块.判断能不能向左移动要用一个变量储存每个已经放了的区间中线段与左端点距离的 ...

  3. reactor模式与java nio

     Reactor是由Schmidt, Douglas C提出的一种模式,在高并发server实现中广泛採用. 改模式採用事件驱动方式,当事件出现时,后调用对应的事件处理代码(Event Handl ...

  4. hdu 2191 悼念512汶川大地震遇难同胞——珍惜如今,感恩生活

    #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int ...

  5. APP-午饭去哪吃

    走到这个快节奏的城市中.部门聚餐.朋友吃饭这些都是日常生活中时有发生的事情,往往吃的东西都是千篇一律,图的也仅仅剩下的是环境了.那么.非常纠结常常去的地方,怎么办呢?来吧.我们随机摇一个吧! wate ...

  6. Java IO(二) 之 InputStream

    源代码均以JDK1.8作为參考 前言: InputStream实现了两个接口Closeable和AutoCloseable: Closeable:JDK1.5中引入,Closeable接口中仅仅有一个 ...

  7. BAPC2014 K&amp;&amp;HUNNU11591:Key to Knowledge(中途相遇法)

    题意: 有N个学生.有M题目 然后相应N行分别有一个二进制和一个整数 二进制代表该同学给出的每道题的答案.整数代表该同学的答案与标准答案相符的个数 要求推断标准答案有几个,假设标准答案仅仅有一种.则输 ...

  8. UTF8有很明显的特征:如果最高字节为0,则表示一个英文字符(与ASCII完全相同)。如果有2个以上1,表示是首个字节。如果最高位是10,则表示一个中间字节。

    摘自<Qt中的C++技术.pdf> page 33

  9. Windows下VS2013+Caffe无GPU配置

    Windows版本的caffe工具包下载地址: 点击打开链接 1. 将下载的caffe-master.zip解压到 D:\Software\Caffe 文件夹下,把 D:\Software\Caffe ...

  10. 安卓开发--AsyncTask

    package com.cnn.asynctask; import android.app.Activity; import android.content.Intent; import androi ...