知识总结------contentProvider与contentResolver

本文介绍了Android中ContentProvider的工作原理和作用,它是应用间数据共享的接口,通过URI进行数据操作。ContentResolver则负责接收并处理这些数据。文章还探讨了为什么使用ContentProvider而非直接使用SQL,并讲解了如何访问assets资源目录下的数据库。同时,讨论了IntentFilter在隐式Intent中的重要性,以及Intent可以传递的数据类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ContentProvider需要自定义一个Class去继承(有的公司API可能会把ContentProvider改成一个abstract,此时就需要使用者灵活改变了),假设这个自定义的类名为myContentProvider,这个定义的类的作用就是为了向其他应用提供信息的类。类似于给BroadCastReciver发送广播通知的系统广播,myContentProvider就是向外散发一个信息,然后对它感兴趣的类会去获取这个信息。ContentProvider向外发送的信息主要通过URI来发送,将一些信息封装在URI中,发送出去。

       继承于ContentProvider的类需要重写(有的公司的API修改了Google原生代码,可能就是实现接口了)

 

ContentProvider是发送URI,对应的ContentResolver是用来接收信息并进行处理的,相比之下,ContentResolver并不需要太多的操作,直接在Content中使用getContentResolver() 来获取默认的ContentResolver对象。

         该对象直接操作URI对应的ContentProvider中的方法,故它属于单例模式。一个Android源码中有大量的COntentProvider和ContentResolver,而URI就是连接对应的Provider和Resolver的利器。

 

1、ContentProvider 是如何实现数据共享的:

在 Android 中如果想将自己应用的数据(一般多为数据库中的数据)提供给第三发应用,那么我们只能通过 ContentProvider 来实现了。 ContentProvider 是应用程序之间共享数据的接口。使用的时候首先自定义 一个类继承 ContentProvider,然后覆写 query、insert、update、delete 等 方法。因为其是四大组件之一因此必须在 AndroidManifest 文件中进行注册。 把自己的数据通过 uri 的形式共享出去 android 系统下 不同程序 数据默认是不能共享访问 需要去实现一个类去继承 ContentProvider。

Uri是这样的获取的:content://包名.providers/表名,然后通过Uri uri = Uri.parse()这个方法获取Uri对象,作为增删改查中的uri对象,这里通过这个uri来作为contentResolver查找对应contentProvider的标志。

 

2. 为什么要用 ContentProvider?它和 sql 的实现上有什么差别?

 ContentProvider 屏蔽了数据存储的细节,内部实现对用户完全透明,用户只 需要关心操作数据的 uri 就可以了,ContentProvider 可以实现不同 app之间 共享。Sql 也有增删改查的方法,但是 sql 只能查询本应用下的数据库。而 ContentProvider 还可以去增删改查本地文件. xml 文件的读取等。

3. 如何访问 asserts 资源目录下的数据库?

把数据库db复制到 /data/data/packagename/databases/目录下 然后直接就能访问了。

4、IntentFilter(Intent过滤器) 

为什么要引入IntentFilter? 

答案:对于显式Intent,它的接受者已被指定,所以系统会自动把这个Intent发给指定的组件。但是对于隐式Intent,由于并没有指定其组件名属性,所以系统不知道该把它发给哪个组件名,于是系统就直接将其发出去,算是所有的组件都有权接收,这就需要定义一个组件可以接收到哪些Intent,所以就引入了IntentFilter(Intent过滤器)。

IntentAndroid中被翻译为意图,他是三种应用程序基本组件-ActivityServicebroadcast receiver之间相互激活的手段。在调用Intent名称时使用ComponentName也就是类的全名时为显示调用。这种方式一般用于应用程序的内部调用,因为你不一定会知道别人写的类的全名。而Intent Filter是指意图过滤,不出现在代码中,而是出现在android Manifest文件中,以<intent-filter>的形式。(有一个例外是broadcast receiverintent
filter
是使用Context.registerReceiver()来动态设定的,其中intent filter也是在代码中创建的)

一个intentactiondatacategory等字段。一个隐式intent为了能够被某个intent filter接收,必须通过3测试,一个intent为了被某个组件接收,则必须通过它所有的intent filter中的一个。

 

5、Intent 传递数据时,可以传递哪些类型数据? 
Intent 可以传递的数据类型非常的丰富,java 的基本数据类型和 String 以及他们的数组形式都可以,除此之 外还可以传递实现了 Serializable 和 Parcelable 接口的对象。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值