Android程序员面试笔试宝典
上QQ阅读APP看书,第一时间看更新

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能实现数据共享的原理。