四大组件面试专题api 架构

Android 这 13 道 ContentProvider 面

2019-11-09  本文已影响0人  圆号本昊
劳力越带,责任越大

前言


希望大家阅读愉快!

文章目录

ContentProvider

方便大家学习,我在 GitHub 上建立个 仓库


1.1 Android 为什么要设计 ContentProvider 这个组件?

为什么要设计 ContentProvider
  1. 封装。对数据进行封装,提供统一的接口,使用者完全不必关心这些数据是在 DBXMLPreferences 或者网络请求来的。当项目需求要改变数据来源时,使用我们的地方完全不需要修改。
  2. 提供一种跨进程数据共享的方式。
  3. 应用程序间的数据共享还有另外的一个重要话题,就是数据更新通知机制了。因为数据是在多个应用程序中共享的,当其中一个应用程序改变了这些共享数据的时候,它有责任通知其它应用程序,让它们知道共享数据被修改了,这样它们就可以作相应的处理。

1.2 如何访问自定义 ContentProvider

如何访问自定义 ContentProvider
  1. ContenResolver 对象通过 Context 提供的方法 getContenResolver() 来获得。
  2. ContenResolver 提供了以下方法来操作:insert delete update query 这些方法分别会调用 ContenProvider 中与之对应的方法并得到返回的结果。

1.3 通过 ContentResolver 获取 ContentProvider 内容的基本步骤

ContentResolver 获取 ContentProvider 内容的基本步骤
  1. 得到 ContentResolver 类对象:ContentResolver cr = getContentResolver ( )
  2. 定义要查询的字段 String 数组。
  3. 使用 cr.query() ; 返回一个 Cursor 对象。
  4. 使用 while 循环得到 Cursor 里面的内容。

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

ContentProvider 是如何实现数据共享的
public class PersonContentProvider extends ContentProvider{

   public boolean onCreate(){ }
   query(Url, String[], String, String[], String);
   insert(Uri,ContentValues);
   update(Uri,ContentValues,String[]);
   delete(Uri,String,String[]);
   
} 

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

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

1.6 Uri 介绍

Uri 介绍
  1. 每一个 ContentProvider 都拥有一个公共的 URI ,这个 URI 用于表示这个 ContentProvider 所提供的数据。
  2. Android 所提供的 ContentProvider 都存放在 android.provider 包中。

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

访问 asserts 资源目录下的数据库

1.8 多个进程同时调用一个 ContentProvider 的 query 获取数据,ContentPrvoider 是如何反应的呢?

调用一个 ContentProvider 的 query 获取数据,ContentPrvoider 是如何反应的

1.9 Android 设计 ContentProvider 的目的是什么呢?

设计 ContentProvider 的目的

1.10 运行在主线程的 ContentProvider 为什么不会影响主线程的UI操作?

ContentProvider 为什么不会影响主线程的UI操作

1.11 外提供数据共享,那么如何限制对方的使用呢?

如何限制对方的使用
<permission android:name="com.android.gallery3d.filtershow.permission.READ"
            android:protectionLevel="signature" />

<permission android:name="com.android.gallery3d.filtershow.permission.WRITE"
            android:protectionLevel="signature" />

<provider
    android:name="com.android.gallery3d.filtershow.provider.SharedImageProvider"
    android:authorities="com.android.gallery3d.filtershow.provider.SharedImageProvider"
    android:grantUriPermissions="true"
    android:readPermission="com.android.gallery3d.filtershow.permission.READ"
    android:writePermission="com.android.gallery3d.filtershow.permission.WRITE" />

1.11.1 如果我们只需要开放部份的 URI 给其他的应用访问呢?

如果我们只需要开放部份的 URI 给其他的应用访问呢
<provider android:name="ContactsProvider2"
    android:authorities="contacts;com.android.contacts"
    android:label="@string/provider_label"
    android:multiprocess="false"
    android:exported="true"
    android:grantUriPermissions="true"
    android:readPermission="android.permission.READ_CONTACTS"
    android:writePermission="android.permission.WRITE_CONTACTS">
    <path-permission
            android:pathPrefix="/search_suggest_query"
            android:readPermission="android.permission.GLOBAL_SEARCH" />
    <path-permission
            android:pathPrefix="/search_suggest_shortcut"
            android:readPermission="android.permission.GLOBAL_SEARCH" />
    <path-permission
            android:pathPattern="/contacts/.*/photo"
            android:readPermission="android.permission.GLOBAL_SEARCH" />
    <grant-uri-permission android:pathPattern=".*" />
</provider>

1.12 ContentProvider 接口方法运行在哪个线程中呢?

ContentProvider 接口方法运行在哪个线程中

1.12.1 这点还是比较好理解的,那如果我要问每个 ContentProvider 的操作是在哪个线程中运行的呢?( 其实我们关心的是 UI 线程和工作线程 )

每个 ContentProvider 的操作是在哪个线程中运行的
  1. ContentProvider 和调用者在同一个进程,ContentProvider 的方法( query/insert/update/delete 等 )和调用者在同一线程中;
  2. ContentProvider 和调用者在不同的进程,ContentProvider 的方法会运行在它自身所在进程的一个 Binder 线程中。
    但是,注意这两种方式在 ContentProvider 的方法没有执行完成前都会 blocked 调用者。所以你应该知道这个上面这个问题的答案了吧。
  3. 也可以看看 CursorLoader 这个类的源码,看 Google 自己是怎么使用 getContentResolver().query 的。

1.13 ContentProvider 是如何在不同应用程序之间传输数据的?

ContentProvider 是如何在不同应用程序之间传输数据

ContentProvider

总结


  1. 在这篇文章中,我对我所知道的 BroadcastReceiver 知识总进行了详细的总结,希望大家通过本次阅读都能有所收获。
  2. 重点:学 Android 有一段时间了,我打算好好的梳理一下所学知识,到现在为止,我才总结完 ActivityServiceBroadcastRecevier 等,有关 事件分发、滑动冲突、新能优化等重要模块,我后面也将详尽的总结,欢迎大家关注 _yuanhao 的简书~ ,方便及时接收更新 ,方便及时接收更新
  3. 如果有可以补充的知识点,欢迎大家在评论区指出。

码字不易,你的点赞是我总结的最大动力!


Android
上一篇下一篇

猜你喜欢

热点阅读