四大组件Android技术知识Android开发

006 四大组件-ContentProvider-补充

2021-05-24  本文已影响0人  凤邪摩羯

前言


希望大家阅读愉快!

文章目录

image

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

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

1.2 如何访问自定义 ContentProvider

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

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

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

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

image
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 的实现上有什么差别?

image

1.6 Uri 介绍

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

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

image

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

image

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

image

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

image

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

image
<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 给其他的应用访问呢?

image
<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 接口方法运行在哪个线程中呢?

image

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

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

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

image

image
上一篇 下一篇

猜你喜欢

热点阅读