ContentProvider+BroadCast的使用

内容提供者的官方定义如下:

 

 

首先是ContentProvider的使用,翻译成中文就是内容提供者,作用就是比如我在从微信往qq传一张图片,我需要一个内容提供者,这里我的微信里面的图片就是一个内容提供者

当然也需要一个内容接收者,这里对应的类就是ContentResolver类,具体的原理就是在内容提供者这个类里面提供一个表和操作数据库增删改查的方法,在内容接收者类里面如果有权限的话

就可以执行这些增删改查方法。

然后是如何创建一个ContentProvider类,具体操作如下所示:

 

 

 

这里需要设置uri,注意URI不完全等于URL,你可以理解为就是一个资源的唯一标识符。

 

 创建完毕之后需要重写这些方法。

与之对应着,会在AndroidManifest.xml里面设置如下的信息

 

 

 

 在ContentProvider类里面需要声明一个全局变量,叫做UriMatcher,具体使用如下:

 

 

 

 new完对象之后可以选择在静态代码块或者在OnCreate方法里面给匹配器添加uri ,一共有三个参数,第一个参数是内容接收者需要传入的内容提供者的uri,第二个参数是内容提供者所对应的表的信息,user/2表示访问的是user表的第二条信息。第三个参数是一个int类型的,代表如果匹配上了就返回这个值。

在我们的内容接收方需要传递的参数如下所示:

 

 写法和url挺像的,前面的content://是固定写法,后面是authority在后面是表的名字,调用match方法,如果匹配成功就返回第三个参数所对应的int值。

 

 这里以query方法为例:这个方法的形参是我通过ContentResolver对象调用时传入的。

然后如果匹配成功了就执行对应的代码。

 

 这里我们通过活动页面的Content上下文对象的getContentResolver()方法获取到内容接收的对象,然后调用query方法提供一系列的参数和uri,如果匹配上了就可以调用方法查询甚至是对表中的数据进行增删改查操作。

 

 

简单讲述完内容提供者之后,我们再来介绍一下广播吧,这里说一下有序广播和无序广播。

首先发送一个广播非常的容易,具体代码实现如下:

 

 哼哼,你要是相信上面的代码就掉坑啦~~~

首先发送广播的还是我们的老朋友意图对象,我们可以创建包裹传入需要的参数给意图对象,也可以通过putExtra()传入相应的键值对。

setAction这个方法比较重要,需要传入的参数和我们后续要说的Reciever类有关系。

 

 

 

 首先需要创建一个继承自BroadcastReceiver的类,快捷方法就不说了,创建完毕之后会在我们的AndroidManifest.xml文件声明如上的标签。

name属性代表我的BroadcastReceiver类的包名,enabled和exported属性的介绍如下:

 

 

 

当我们发送完一个广播的时候,我们new的BroadCastReceiver对象就会马上执行onReceive方法。

当然广播是有限资源,所以需要注册使用并且及时关闭。

 

 如上是注册和注销接收器的代码,注意这里我们往receiver对象里面添加了一个IntentFilter对象,这个过滤器对象里面需要添加addAction()里面的参数就和我们Intent里面的要一致

 

 打个比方,你收听广播,每一个广播台都对应一个频率,这个频率是来自于发送广播的人,我们接收广播自然也需要这个频率,只有这样,我们的receiver才能接收到并且是唯一的接收到来自于上方Intent发送的广播,注意为什么我上面没有startActivity呢,因为执行了这个方法的话这个Activity的声明周期就会执行暂停和中止方法,相当于我们的广播台不播送内容了,那么自然而然收听者也就接收不到数据,这里可以拿两个APP做实验,用来说明关于广播的使用。

动态注册广播,只是把sendBroadcast方法变成了sendOrderedBroadcast方法

 

 setPriority方法用来给接收器设置优先级,优先级越高,越先接收到广播。最后是

 

 abortBroadcast方法,这个方法可以截断广播,这样的话后面的广播接收者就接收不到广播了。

 

posted @ 2023-03-03 22:59  -她的梦-  阅读(41)  评论(0编辑  收藏  举报