一、ContentProvider介绍
ContentProvider是Android中的一个组件,用于实现应用程序之间的数据共享。它提供了一种标准化的接口,允许应用程序通过ContentResolver类与其他应用程序的数据进行交互,而不需要了底层数据存储的细节。
使用ContentProvi的好处是可以将数据存储在一个中心位置,并通过URI来访问和操作数据。这样,其他应用程序可以通过ContentResolver类来访问和修改这些数据,而不需要了解数据存储的具体实现细节。
ContentProvider还提供了一种安全的方式来共享数据。通过在ContentProvider中定义权限,可以控制哪些应用程序可以访问和修改数据。这样可以确保数据的安全性和隐私。
总结来说,使用ContentProvider的好处包括:
-
提供了一种标准化的接口,方便应用程序之间的数据共享。
-
隐藏了底层数据存储的细节,使应用程序更加模块化和可维护。
-
提供了安全的数据共享机制,可以控制数据的访问权限。
二、ContentProvider相关类
ContentProvider
ContentProvider是Android中的一个组件,用于实现应用程序之间的数据共享。它提供了一种标准化的接口,允许应用程序通过ContentResolver类与其他应用程序的数据进行交互,而不需要了底层数据存储的细节。
ContentProvider文件路径:
frameworks/base/core/java/android/content/ContentProvider.java
ContentProvider定义:
public abstract class ContentProvider implements ContentInterface, ComponentCallbacks2 {
class Transport extends ContentProviderNative {}
public final class CallingIdentity {}
}
ContentProvider 方法:
ContentProvider():构建一个ContentProvider实例。
ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations):重写此操作以处理执行一批操作的请求,或者默认实现将迭代操作并在每个操作上调用 apply(ContentProvider, ContentProviderResult[], int) 。
void attachInfo(Context context, ProviderInfo info):在被实例化之后,这被称为告诉内容提供者自己。
int bulkInsert(Uri uri, ContentValues[] values):重写此操作以处理插入一组新行的请求,或者默认实现将迭代这些值并在其中每个值上调用 insert(Uri, ContentValues) 。
Bundle call(String method, String arg, Bundle extras):调用提供者定义的方法。
Uri canonicalize(Uri url):实现这一点,以支持引用您的内容提供者的URI的标准化
abstract int delete(Uri uri, String selection, String[] selectionArgs):实现这个来处理删除一行或多行的请求。
final String getCallingPackage():返回在当前线程上发起正在处理的请求的调用方的包名称。
final Context getContext():检索此提供程序运行的上下文。
final PathPermission[] getPathPermissions():返回对此内容提供者进行读取和/或写入访问所需的基于路径的权限。
final String getReadPermission():将只读访问所需权限的名称返回给此内容提供者。
String[] getStreamTypes(Uri uri, String mimeTypeFilter):由客户端调用以确定此内容提供程序支持的给定URI的数据流类型。
abstract String getType(Uri uri):实现这个来处理给定URI处的数据的MIME类型请求。
final String getWritePermission():将读取/写入权限所需的权限的名称返回给此内容提供者。
abstract Uri insert(Uri uri, ContentValues values):实现这个来处理插入新行的请求。
void onConfigurationChanged(Configuration newConfig):设备配置在组件运行时发生更改时由系统调用。 此方法始终在应用程序主线程上调用,并且不得执行冗长的操作。
abstract boolean onCreate():在启动时实现这个以初始化您的内容提供者。
void onLowMemory():这在整个系统内存不足时调用,并且主动运行的进程应该修剪内存使用情况。 此方法始终在应用程序主线程上调用,并且不得执行冗长的操作。
void onTrimMemory(int level):当操作系统确定进程从其进程中删除不需要的内存是一个好时机时调用。
AssetFileDescriptor openAssetFile(Uri uri, String mode, CancellationSignal signal):这类似于 openFile(Uri, String) ,但可以由需要能够返回文件子部分的提供者实现,这些文件通常是.apk中的资源。
AssetFileDescriptor openAssetFile(Uri uri, String mode):这类似于 openFile(Uri, String) ,但可以由需要能够返回文件子部分的提供者实现,这些文件通常是.apk中的资源。
ParcelFileDescriptor openFile(Uri uri, String mode, CancellationSignal signal):重写这个来处理打开一个文件blob的请求。
ParcelFileDescriptor openFile(Uri uri, String mode):重写这个来处理打开一个文件blob的请求。
<T> ParcelFileDescriptor openPipeHelper(Uri uri, String mimeType, Bundle opts, T args, PipeDataWriter<T> func):用于实现 openTypedAssetFile(Uri, String, Bundle)辅助函数,用于创建数据管道和后台线程,允许您将生成的数据流式传输回客户端。
AssetFileDescriptor openTypedAssetFile(Uri uri, String mimeTypeFilter, Bundle opts):由客户端调用以打开包含特定MIME类型数据的只读流。
AssetFileDescriptor openTypedAssetFile(Uri uri, String mimeTypeFilter, Bundle opts, CancellationSignal signal):由客户端调用以打开包含特定MIME类型数据的只读流。
Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal):实现这个来处理来自客户端的查询请求,并支持取消。
abstract Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):实现这个来处理来自客户端的查询请求。
void shutdown():实现这个关闭ContentProvider实例。
Uri uncanonicalize(Uri url):从以前由 canonicalize(Uri)返回的规范化URI中删除规范化。
abstract int update(Uri uri, ContentValues values, String selection, String[] selectionArgs):实现这个来处理更新一行或多行的请求。
ContentResolver
ContentResolver是Android中的一个类,用于与ContentProvider进行交互,从而实现对结构化数据集的访问。通过ContentResolver,我们可以对其他应用程序的数据进行查询、插入、更新和删除操作。
ContentResolver文件路径:
frameworks/base/core/java/android/content/ContentResolver.java
ContentResolver定义:
public abstract class ContentResolver implements ContentInterface {}
ContentResolver 方法:
ContentResolver(Context context):构造方法。
final ContentProviderClient acquireContentProviderClient(Uri uri):返回一个 ContentProviderClient ,与 ContentProvider相关联,该服务为uri上的内容提供服务,并在必要时启动提供程序。
final ContentProviderClient acquireContentProviderClient(String name):返回 ContentProviderClient与该关联 ContentProvider与名称的权限,如果有必要开始提供商。
final ContentProviderClient acquireUnstableContentProviderClient(String name):像 acquireContentProviderClient(String)一样,但用于不信任目标内容提供者的稳定性时使用。
final ContentProviderClient acquireUnstableContentProviderClient(Uri uri):像 acquireContentProviderClient(Uri)一样,但用于不信任目标内容提供商的稳定性时使用。
static void addPeriodicSync(Account account, String authority, Bundle extras, long pollFrequency):指定应使用指定的频率的帐户,授权和附加功能请求同步。
static Object addStatusChangeListener(int mask, SyncStatusObserver callback):当SyncManager的不同方面发生变化时请求通知。
ContentProviderResult[] applyBatch(String authority, ArrayList<ContentProviderOperation> operations):应用每个 ContentProviderOperation对象并返回其结果数组。
final int bulkInsert(Uri url, ContentValues[] values):将多行插入给定URL中的表中。
final Bundle call(Uri uri, String method, String arg, Bundle extras):调用提供者定义的方法。
static void cancelSync(SyncRequest request):删除指定的同步。
static void cancelSync(Account account, String authority):取消任何与帐户和权限匹配的活动或待处理同步。
final Uri canonicalize(Uri url):将给定的 URL转换为其引用资源的标准表示形式,可以跨设备使用,持久化,备份和恢复等。
final int delete(Uri url, String where, String[] selectionArgs) :删除由内容URI指定的行。
static List<SyncInfo> getCurrentSyncs():返回包含所有活动同步信息的列表。
static int getIsSyncable(Account account, String authority):检查此帐户/提供者是否可以同步。
static boolean getMasterSyncAutomatically():获取适用于所有提供者和帐户的主自动同步设置。
List<UriPermission> getOutgoingPersistedUriPermissions():返回由调用应用程序托管的所有持久URI权限授予的列表。
static List<PeriodicSync> getPeriodicSyncs(Account account, String authority):获取有关给定帐户和权限的定期同步的信息列表。
List<UriPermission> getPersistedUriPermissions():返回调用应用程序保留的所有URI许可授权的列表。
String[] getStreamTypes(Uri url, String mimeTypeFilter):查询可能的MIME类型的表示形式给定的内容URL可以在与 openTypedAssetFileDescriptor(Uri, String, Bundle)一起作为数据流打开时返回。
static SyncAdapterType[] getSyncAdapterTypes():获取有关系统已知的SyncAdapter的信息。
final String getType(Uri url):返回给定内容URL的MIME类型。
final Uri insert(Uri url, ContentValues values):在给定网址的表格中插入一行。
static boolean isSyncActive(Account account, String authority):如果当前正在处理给定帐户或权限的当前同步操作,则返回true。
static boolean isSyncPending(Account account, String authority):如果任何匹配权限的待处理状态为真,则返回true。
void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork):通知注册的观察者一行已更新。
void notifyChange(Uri uri, ContentObserver observer, int flags):通知注册的观察者一行已更新。
void notifyChange(Uri uri, ContentObserver observer):通知注册的观察者一行已更新并尝试将更改同步到网络。
final AssetFileDescriptor openAssetFileDescriptor(Uri uri, String mode, CancellationSignal cancellationSignal):打开原始文件描述符以访问URI下的数据。
final AssetFileDescriptor openAssetFileDescriptor(Uri uri, String mode):打开原始文件描述符以访问URI下的数据。
final AssetFileDescriptor openFileDescriptor(Uri uri, String mode, CancellationSignal cancellationSignal):打开原始文件描述符以访问URI下的数据。
final AssetFileDescriptor openFileDescriptor(Uri uri, String mode):打开原始文件描述符以访问URI下的数据。
final InputStream openInputStream(Uri uri):打开一个流到与内容URI相关联的内容。
final OutputStream openOutputStream(Uri uri):同义词为 openOutputStream(uri, "w") 。
final OutputStream openOutputStream(Uri uri, String mode):打开一个流到与内容URI相关联的内容。
final AssetFileDescriptor openTypedAssetFileDescriptor(Uri uri, String mimeType, Bundle opts, CancellationSignal cancellationSignal):打开原始文件描述符以从“content:”URI访问(可能是经过类型转换的)数据。
final AssetFileDescriptor openTypedAssetFileDescriptor(Uri uri, String mimeType, Bundle opts):打开原始文件描述符以从“content:”URI访问(可能是经过类型转换的)数据。
final Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal):查询给定的URI,在结果集上返回一个 Cursor ,并带有可选的支持取消。
final Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):查询给定的URI,在结果集上返回 Cursor 。
final void registerContentObserver(Uri uri, boolean notifyForDescendants, ContentObserver observer):注册一个观察者类,当给定内容URI标识的数据发生变化时,该类将获得回调。
void releasePersistableUriPermission(Uri uri, int modeFlags):放弃持久的URI权限授予。
static void removePeriodicSync(Account account, String authority, Bundle extras):删除周期性同步。
static void removeStatusChangeListener(Object handle):删除以前注册的状态更改侦听器。
static void requestSync(Account account, String authority, Bundle extras):开始异步同步操作。
static void requestSync(SyncRequest request):注册与SyncManager的同步。
static void setIsSyncable(Account account, String authority, int syncable):设置此帐户/提供者是否可以同步。
static void setMasterSyncAutomatically(boolean sync):设置适用于所有提供者和帐户的主自动同步设置。
static void setSyncAutomatically(Account account, String authority, boolean sync):设置提供者在收到网络痒感时是否同步。
void takePersistableUriPermission(Uri uri, int modeFlags):获取已提供的持久性URI权限授予。
final Uri uncanonicalize(Uri url):鉴于之前由 canonicalize(Uri)生成的典型Uri,请将其转换为本地非规范形式。
final void unregisterContentObserver(ContentObserver observer):取消注册变更观察员。
final int update(Uri uri, ContentValues values, String where, String[] selectionArgs):更新内容URI中的
ContentProviderClient
ContentProviderClient是Android中用于访问ContentProvider的类。它提供了一组方法来执行对ContentProvider的查询、插入、更新和删除操作。
ContentProviderClient文件路径:
frameworks/base/core/java/android/content/ContentProviderClient.java
ContentProviderClient定义:
public class ContentProviderClient implements ContentInterface, AutoCloseable {
private class NotRespondingRunnable implements Runnable {}
private final class CursorWrapperInner extends CrossProcessCursorWrapper {}
}
ContentProviderOperation
ContentProviderOperation是Android中的一个类,用于在批量模式下访问ContentProvider。通过创建ContentProviderOperation对象数组,并使用ContentResolver的applyBatch()方法将其分派给内容提供程序,可以实现对内容提供程序的批量操作。在调用applyBatch()方法时,需要传递内容提供程序的授权,而不是特定的内容URI。这样可以使数组中的每个ContentProviderOperation对象适用于其他表。调用applyBatch()方法会返回一个结果数组。
ContentProviderOperation文件路径:
frameworks/base/core/java/android/content/ContentProviderOperation.java
ContentProviderOperation定义:
public class ContentProviderOperation implements Parcelable {
public static class BackReference implements Parcelable {}
public static class Builder {}
}
ContentProviderResult
ContentProviderResult是一个用于表示ContentProvider操作结果的类。它包含了对ContentProvider进行插入、更新、删除等操作后返回的结果信息。
ContentProviderResult文件路径:
frameworks/base/core/java/android/content/ContentProviderResult.java
ContentProviderResult定义:
public class ContentProviderResult implements Parcelable {}
ContentProviderNative
ContentProviderNative是Android系统中的一个类,用于处理Content Provider的底层实现。它提供了一些方法来处理Content Provider的请求和操作。
ContentProviderResult文件路径:
frameworks/base/core/java/android/content/ContentProviderResult.java
ContentProviderResult定义:
abstract public class ContentProviderNative extends Binder implements IContentProvider {}
final class ContentProviderProxy implements IContentProvider {}
ContentQueryMap
ContentQueryMap是Android中的一个类,用于将ContentProvider中的数据映射到一个可观察的Map对象中。它可以实时地跟踪ContentProvider中数据的变化,并提供了方便的方法来访问和操作这些数据。
ContentQueryMap文件路径:
frameworks/base/core/java/android/content/ContentQueryMap.java
ContentQueryMap定义:
public class ContentQueryMap extends Observable {}
ContentUris
ContentUris是Android中的一个工具类,用于处理ContentProvider中的数据的URI。它提供了一些方法来解析和操作URI中的ID部分。
ContentUris文件路径:
frameworks/base/core/java/android/content/ContentUris.java
ContentUris定义:
public class ContentUris {}
ContentValues
ContentValues是Android中的一个类,用于存储键值对数据。它类似于字典对象,可以用来操作数据库中的数据。通过put()方法,可以将不同类型的数据存储到ContentValues对象中。
ContentValues文件路径:
frameworks/base/core/java/android/content/ContentValues.java
ContentValues定义:
public abstract class Context {}
ContentProviderHelper
ContentProviderHelper是一个用于发现、查看和查询Android内容提供者数据的前端工具。可以帮助开发人员更方便地使用ContentProvider,并提供了一些改进功能。
ContentProviderHelper文件路径:
frameworks/base/service/core/java/com/android/server/am/ContentProviderHelper.java
ContentProviderHelper定义:
public class ContentProviderHelper {}
ContentProviderRecord
ContentProviderRecord是一个类,用于保存Content Provider的相关信息。
ContentProviderRecord文件路径:
frameworks/base/service/core/java/com/android/server/am/ContentProviderRecord.java
ContentProviderRecord定义:
final class ContentProviderRecord implements ComponentName.WithComponentName {}
ContentProviderConnection
ContentProviderConnection是Android中的一个类,用于表示应用程序与ContentProvider之间的连接。它用于在应用程序和ContentProvider之间进行数据交互和通信。
ContentProviderConnection类的实例通常由ActivityManagerService(AMS)创建和管理。当应用程序需要与ContentProvider建立连接时,AMS会创建一个ContentProviderConnection对象,并将其与应用程序和ContentProvider之间的通信通道建立起来。
ContentProviderConnection对象包含了与ContentProvider相关的信息,例如ContentProvider的包名、进程ID、用户ID等。它还可以用于跟踪和管理应用程序与ContentProvider之间的连接状态。
在引用中的代码片段中,ActivityThread的installContentProviders方法使用ContentProviderConnection对象来安装和发布ContentProvider。它通过调用installProvider方法来安装ContentProvider,并将安装成功的ContentProviderHolder对象添加到结果列表中。然后,它使用ActivityManager.getService().publishContentProviders方法来告知AMS,本应用程序成功安装了哪些ContentProvider。
引用中的日志信息显示了一个ContentProviderConnection对象的异常情况。具体来说,它表示一个ContentProviderConnection对象的提供者已经死亡,但AMS不同意这个情况。这可能是由于应用程序或ContentProvider的异常终止导致的。
总结来说,ContentProviderConnection是Android中用于应用程序与ContentProvider之间通信和数据交互的类。它由AMS创建和管理,并包含与ContentProvider相关的信息。在应用程序安装和发布ContentProvider时,ContentProviderConnection对象起到了重要的作用。
ContentProviderConnection文件路径:
frameworks/base/service/core/java/com/android/server/am/ContentProviderConnection.java
ContentProviderConnection定义:
public final class ContentProviderConnection extends Binder {}