1.4.3 常见面试笔试真题
1)谈一谈你对ContentProvider的理解和使用。
解答:
①ContentProvider是Android以结构化方式存储的数据工具。它以相对安全的方式封装数据并且提供简易的处理机制。ContentProvider提供不同进程间数据交互的标准化接口来供外部调用;
②ContentProvider是允许不同应用进行数据交换的标准的API,ContentProvider以Uri的形式对外提供数据的访问操作接口,而其他应用则通过ContentResolver根据Uri去访问指定的数据;
③Uri是统一资源标识符,是一个用于标识某一互联网资源名称的字符串。该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。Uri由包括确定语法和相关协议的方案所定义。由3个组成部分:访问资源的命名机制、存储资源的主机名和资源自身的名称,由路径表示。
例如:content://com.android.pingred/app中:
content://使用的是content协议,属于默认规定;
com.android.pingred属于自己定义的主机名,唯一标识并区分不同的ContentProvider继承类,
app则是资源部分,当访问不同的资源的时候,这部分会动态改变;
④一旦定义好自己的ContentProvider类,就可以使用ContentResolver进行访问操作了。ContentResolver类的方法都会在其内部调用Uri主机部分确定的ContentProvider;
⑤最后定义一个自己的ContentProvider类,重写各种方法,实现增删改查数据。
2)说一下ContentProvider、ContentResolver、ContentObserver之间的关系。
思路:三者的关系其实就是通过ContentResolver来对ContentProvider提供的数据进行访问与修改等操作,并且注册ContentObserver来监听数据的变化情况。分别以是什么、有什么用、怎么用的思路去简单说一下这三者之间的关系即可。
解答:
●ContentProvider:
①四大组件之一,给那些需要共享给其他应用的数据创建了外部访问接口,其他应用只需调用这些接口就能访问到要交互的数据了;
②为应用之间的数据共享提供了渠道,例如一些应用可以访问手机系统的通讯录,而且可以进行修改手机号码与姓名等操作,都是因为通讯录使用了ContentProvider;
③要让应用的某些数据能让别的应用访问或者修改,就使用ContentProvider,而如果想要访问或者修改的数据已经实现了ContentProvider,那么该应用就要使用ContentResolver。
●ContentResolver:
①内容解析,获取ContentProvider提供的数据;
②使用notifyChange(uri)来发出消息。
●ContentObserver:
监听因Uri引起的数据的变化,然后做出响应,有表监听器和行监听器,根据它的Uri的种类来判断,调用registerContentObserver()来监听。
3)ContentProvider是如何实现数据共享的?
思路:把在创建自定义ContentProvider的过程给描述一遍即可,接下来用代码来分析。
解答:
创建自定义ContentProvider并继承ContentProvider类,定义好调用方要访问的数据对应的Uri内容:
很明显,这里定义的访问数据是pingred表的所有数据和pingred表的一条数据。接着再重写那6个方法:
这里以查询功能为例,在里面通过UriMather的match()方法对内容Uri进行匹配,然后就能得出调用方要查找的是什么数据了:
剩下的insert()、update()和delete()方法的实现也差不多跟query()方法一样,根据传入的Uri对象去进行匹配,就能知道调用方要操作的数据位于哪张表、哪一行。最后,在getType()方法里获取Uri对象对应的MIME类型:
以上的整个过程其实就是ContentProvider能实现数据共享的原理。