第10章 ContentProvider与BroadcastReceiver_第1页
第10章 ContentProvider与BroadcastReceiver_第2页
第10章 ContentProvider与BroadcastReceiver_第3页
第10章 ContentProvider与BroadcastReceiver_第4页
第10章 ContentProvider与BroadcastReceiver_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ContentProvider与BroadcastReceiver课程安排nContentProvidernContentResolvernBroadcastReceiverContentProviderContentProvider是不同应用程序之间进行数据交换的标准API, ContentProvider以一些Uri的形式对外提供数据,允许其它应用访问或修改数据;其它应用程序使用ContentProvider根据Uri去访问操作指定数据完整地开发一个ContentProvider步骤如下:1.定义FirstProvider类,并继承Android提供的ContentProvider类,并复

2、写下列方法:onCreate() 初始化内容提供器的时候调用。通常会在这里完成对数据库的创建和升级等操作,返回 true 表示内容提供器初始化成功,返回 false 则表示失败。注意,只有当存在ContentResolver尝试访问我们程序中的数据时,内容提供器才会被初始化。query() 从内容提供器中查询数据。使用uri参数来确定查询哪张表,projection参数用于确定查询哪些列,selection和 selectionArgs参数用于约束查询哪些行,sortOrder参数用于对结果进行排序,查询的结果存放在Cursor对象中返回。insert() 向内容提供器中添加一条数据。使用 u

3、ri参数来确定要添加到的表,待添加的数据保存在values参数中。添加完成后,返回一个用于表示这条新记录的URI。update() 更新内容提供器中已有的数据。使用 uri参数来确定更新哪一张表中的数据,新数据保存在values参数中,selection和selectionArgs参数用于约束更新哪些行,受影响的行数将作为返回值返回。delete() 从内容提供器中删除数据。使用 uri 参数来确定删除哪一张表中的数据,selection和selectionArgs参数用于约束删除哪些行,被删除的行数将作为返回值返回。getType()根据传入的内容 URI来返回相应的 MIME类型。2.在A

4、ndroidManifest.xml文件中注册这个ContentProvider.Uri介绍Uri代表了要操作的数据,Uri主要包含了两部分信息:1需要操作的ContentProvider ,2对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content:/主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:要操作p

5、erson表中id为10的记录,可以构建这样的路径:/person/10要操作person表中id为10的记录的name字段, person/10/name要操作person表中的所有记录,可以构建这样的路径:/person要操作xxx表中的记录,可以构建这样的路径:/xxx当然要操作的数据不一定来自数据库,也可以是文件等他存储方式,如下:要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:Uri uri = Uri.parse(content:/com.lxt008.pr

6、ovider.personprovider/person) UriMatcher类使用介绍因为Uri代表了要操作的数据,所以我们经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。UriMatcher类用于匹配Uri,它的用法如下:首先第一步把你需要匹配Uri路径全部给注册上,如下:/常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATC

7、H);/如果match()方法匹配content:/vider.personprovider/person路径,返回匹配码为1sMatcher.addURI(“vider.personprovider”, “person”, 1);/添加需要匹配uri,如果匹配就会返回匹配码/如果match()方法匹配content:/vider.personprovider/person/230路径,返回匹配码为2sMatcher.addURI(“vider.personprovider”, “p

8、erson/#”, 2);/#号为通配符switch (sMatcher.match(Uri.parse(content:/vider.personprovider/person/10) case 1 break; case 2 break; default:/不匹配 break;注册完需要匹配的Uri后,就可以使用sMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配content:/vider.personprovider/person路径,返

9、回的匹配码为1 ContentUris类使用介绍ContentUris类用于获取Uri路径后面的ID部分,它有两个比较实用的方法:withAppendedId(uri, id)用于为路径加上ID部分:Uri uri = Uri.parse(content:/vider.personprovider/person)Uri resultUri = ContentUris.withAppendedId(uri, 10); /生成后的Uri为:content:/vider.personprovider/person/10parseId(uri)方

10、法用于从路径中获取ID部分:Uri uri = Uri.parse(content:/vider.personprovider/person/10)long personid = ContentUris.parseId(uri);/获取的结果为:10使用ContentProvider共享数据ContentProvider类主要方法的作用:public boolean onCreate()该方法在ContentProvider创建后就会被调用, Android在系统启动时就会创建ContentProvider 。public Uri insert(Uri uri, C

11、ontentValues values)该方法用于供外部应用往ContentProvider添加数据。public int delete(Uri uri, String selection, String selectionArgs)该方法用于供外部应用从ContentProvider删除数据。public int update(Uri uri, ContentValues values, String selection, String selectionArgs)该方法用于供外部应用更新ContentProvider中的数据。public Cursor query(Uri uri, Str

12、ing projection, String selection, String selectionArgs, String sortOrder)该方法用于供外部应用从ContentProvider中获取数据。public String getType(Uri uri)该方法用于返回当前Url所代表数据的MIME类型。如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头,例如:要得到所有person记录的Uri为content:/vider.personprovider/person,那么返回的MIME类型字符串

13、应该为:“vnd.android.cursor.dir/person”。如果要操作的数据属于单一数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头,例如:得到id为10的person记录,Uri为content:/vider.personprovider/person/10,那么返回的MIME类型字符串应该为:“vnd.android.cursor.item/person”。 源码详见FirstProviderContentResolver当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以

14、使用ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver 类提供了与ContentProvider类相同签名的四个方法:public Uri insert(Uri uri, ContentValues values)该方法用于往ContentProvider添加数据。public int delete(Uri uri, String selection, String selectionArgs)该方法用于从ContentProvider删除数据。pub

15、lic int update(Uri uri, ContentValues values, String selection, String selectionArgs)该方法用于更新ContentProvider中的数据。public Cursor query(Uri uri, String projection, String selection, String selectionArgs, String sortOrder)该方法用于从ContentProvider中获取数据。这些方法的第一个参数为Uri,代表要操作的是哪个ContentProvider和对其中的什么数据进行操作,假设给

16、定的是: Uri.parse(“content:/vider.personprovider/person/10”),那么将会对主机名为vider.personprovider的ContentProvider进行操作,操作的数据为person表中id为10的记录。ContentResolver使用ContentResolver对ContentProvider中的数据进行添加、删除、修改和查询操作:ContentResolver resolver = getContentResolver();Uri uri = Uri.parse(“cont

17、ent:/vider.personprovider/person);/添加一条记录ContentValues values = new ContentValues();values.put(name, “lxt008);values.put(age, 35);resolver.insert(uri, values);/获取person表中所有记录Cursor cursor = resolver.query(uri, null, null, null, personid desc);while(cursor.moveToNext()Log.i(ContentTest,

18、 personid=+ cursor.getInt(0)+ ,name=+cursor.getString(1);/把id为1的记录的name字段值更改新为limingContentValues updateValues = new ContentValues();updateValues.put(name, liming);Uri updateIdUri = ContentUris.withAppendedId(uri, 2);resolver.update(updateIdUri, updateValues, null, null);/删除id为2的记录Uri deleteIdUri =

19、ContentUris.withAppendedId(uri, 2);resolver.delete(deleteIdUri, null, null);ContentResolverAndroid系统提供了Contacts应用程序来管理联系人,而且Android系统还为联系人管理提供了ContentProvider,这里允许其它应用程序以ContentResolver来管理联系人数据.管理联系人的URIContactsContract.Contacts.CONTENT_URI管理联系人电话的URIContactsContract.CommonDataKinds.Phone.CONTENT_UR

20、I管理联系人E-mail的URIContactsContract.CommonDataKinds.Email.CONTENT_URI/ 使用ContentResolver查找联系人数据Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null,null, null);/ 获取联系人IDString contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID);/ 获取联

21、系人的名字String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);注意给APP添加访问权限Broadcast Intent Receiver当你想要写一个程序来对外部的事件做些处理时,可以使用Broadcast Intent Receiver。比如:当电话响时,有短信时。Broadcast Intent Receiver它并不能拿来显示UI画面,它必需利用NotificationManager来通知使用者他们感兴趣的事件发生了。Broadcast Intent Re

22、ceiver同样的可以在AndroidManifest.xml中声明,但你也可以用写 Context.registerReceiver()程序的方式来注册你自己的Broadcast Intent Receiver。你自己的程序并不会因为BroadcastReceivers被呼叫而被它执行起来。而是当BroadcastReceiver被触发 时系统会依需求来执行相对应的程序。程序可以利用Context.sendBroadcast()来发出他们自己的intent broadcast给其它的程序。广播接收者-BroadcastReceiver广播接收者(BroadcastReceiver)用于异步接

23、收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收。要实现一个广播接收者方法如下:第一步:继承BroadcastReceiver,并重写onReceive()方法。public class IncomingSMSReceiver extends BroadcastReceiver Override public void onReceive(C

24、ontext context, Intent intent) 第二步:订阅感兴趣的广播Intent,订阅方法有两种:第一种:使用代码进行订阅IntentFilter filter = new IntentFilter(vider.Telephony.SMS_RECEIVED);IncomingSMSReceiver receiver = new IncomingSMSReceiver();registerReceiver(receiver, filter);第二种:在AndroidManifest.xml文件中的节点里进行订阅: 使用广播接收者窃听短信如果你想窃听别人接收

25、到的短信,达到你不可告人的目的,那么本节内容可以实现你的需求。当系统收到短信时,会发出一个action名称为vider.Telephony.SMS_RECEIVED的广播Intent,该Intent存放了接收到的短信内容,使用名称“pdus”即可从Intent中获取短信内容。public class IncomingSMSReceiver extends BroadcastReceiver private static final String SMS_RECEIVED = vider.Telephony.SMS_RECEIVED;Override

26、public void onReceive(Context context, Intent intent) if (intent.getAction().equals(SMS_RECEIVED) SmsManager sms = SmsManager.getDefault();Bundle bundle = intent.getExtras();if (bundle != null) Object pdus = (Object) bundle.get(pdus);SmsMessage messages = new SmsMessagepdus.length;for (int i = 0; i pdus.length; i+) messagesi = SmsMessage.createFromPdu(byte) pdusi);for (SmsMessage message : messages)String msg = message.getMessageBody();String to = message.getDisplayOriginatingAddress();sms.sendTextMessage(to, n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论