首页 > 其他分享 >深入分析 Android ContentProvider (二)

深入分析 Android ContentProvider (二)

时间:2024-07-23 11:24:57浏览次数:9  
标签:ContentObserver 批量 示例 深入分析 Android ContentProvider 数据 public

文章目录

深入分析 Android ContentProvider (二)

ContentProvider 是 Android 中用于数据共享和跨进程通信的重要组件,通过统一的接口和标准化的 URI 访问方式,提供了安全、封装和高效的数据操作。接下来,我们将更详细地介绍 ContentProvider 的高级特性和常见使用场景。

1. 高级特性和常见使用场景

1.1. 使用 ContentObserver 监听数据变化

ContentObserver 用于监听 ContentProvider 中数据的变化,当数据发生改变时会收到通知。这样可以实现实时数据同步或更新 UI。

示例:实现 ContentObserver

创建一个 ContentObserver 并注册它来监听数据变化:

public class MyContentObserver extends ContentObserver {
    public MyContentObserver(Handler handler) {
        super(handler);
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        // 数据变化处理逻辑
    }

    @Override
    public void onChange(boolean selfChange, Uri uri) {
        super.onChange(selfChange, uri);
        // 处理特定 URI 的数据变化
    }
}

在需要监听的地方注册 ContentObserver:

Handler handler = new Handler();
MyContentObserver observer = new MyContentObserver(handler);
getContentResolver().registerContentObserver(ExampleProvider.CONTENT_URI, true, observer);

注销 ContentObserver 以避免内存泄漏:

getContentResolver().unregisterContentObserver(observer);

1.2. 数据同步

ContentProvider 可以与 SyncAdapter 结合,实现自动数据同步。例如,当远程服务器上的数据发生变化时,可以通过 SyncAdapter 同步到本地数据库,并通过 ContentProvider 提供的数据接口进行访问。

示例:实现 SyncAdapter

创建 SyncAdapter:

public class ExampleSyncAdapter extends AbstractThreadedSyncAdapter {
    public ExampleSyncAdapter(Context context, boolean autoInitialize) {
        super(context, autoInitialize);
    }

    @Override
    public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
        // 同步逻辑
        // 更新数据后通过 provider.notifyChange 通知变化
    }
}

配置 SyncAdapter 和 ContentProvider 结合:

<sync-adapter
    android:contentAuthority="com.example.provider"
    android:accountType="com.example.account"
    android:userVisible="true"
    android:supportsUploading="true"
    android:allowParallelSyncs="false"
    android:isAlwaysSyncable="true" />

1.3. 批量操作

ContentProvider 支持批量操作,通过 applyBatch 方法可以一次性执行多个操作,提高效率。

示例:批量操作

创建 ContentProvider 中的批量操作方法:

@Override
public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations) throws OperationApplicationException {
    final SQLiteDatabase db = databaseHelper.getWritableDatabase();
    db.beginTransaction();
    try {
        ContentProviderResult[] results = super.applyBatch(operations);
        db.setTransactionSuccessful();
        return results;
    } finally {
        db.endTransaction();
    }
}

使用批量操作:

ArrayList<ContentProviderOperation> operations = new ArrayList<>();
operations.add(ContentProviderOperation.newInsert(CONTENT_URI)
        .withValue("name", "Example1")
        .build());
operations.add(ContentProviderOperation.newInsert(CONTENT_URI)
        .withValue("name", "Example2")
        .build());
try {
    getContentResolver().applyBatch("com.example.provider", operations);
} catch (RemoteException | OperationApplicationException e) {
    e.printStackTrace();
}

1.4. 权限控制

为了保护敏感数据,ContentProvider 可以通过声明权限来控制数据访问。

示例:声明权限

AndroidManifest.xml 中声明权限:

<permission android:name="com.example.provider.READ" android:protectionLevel="signature" />
<permission android:name="com.example.provider.WRITE" android:protectionLevel="signature" />
<provider
    android:name=".ExampleProvider"
    android:authorities="com.example.provider"
    android:exported="true"
    android:readPermission="com.example.provider.READ"
    android:writePermission="com.example.provider.WRITE" />

在 ContentProvider 中检查权限:

@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,
                    @Nullable String[] selectionArgs, @Nullable String sortOrder) {
    if (getContext().checkCallingOrSelfPermission("com.example.provider.READ") == PackageManager.PERMISSION_DENIED) {
        throw new SecurityException("Permission denied");
    }
    // 执行查询操作
}

2. ContentProvider 的设计总结

ContentProvider 作为 Android 中跨应用数据共享的重要机制,具备以下设计优势:

  1. 标准化接口:提供了统一的数据访问接口,简化了跨进程数据操作的实现。
  2. 安全性:通过权限控制和 URI 权限授予,确保数据访问的安全性。
  3. 数据封装:将数据操作逻辑封装在 ContentProvider 中,提高了代码的模块化和可维护性。
  4. 批量操作和事务:支持批量操作和事务处理,提高了数据操作的效率和一致性。
  5. 通知机制:通过 ContentObserver 实现数据变化的实时监听和通知,便于实现数据同步和 UI 更新。

通过合理设计和使用 ContentProvider,开发者可以构建高效、安全、可扩展的 Android 应用,实现复杂的数据交互和共享需求。

欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力

在这里插入图片描述

标签:ContentObserver,批量,示例,深入分析,Android,ContentProvider,数据,public
From: https://blog.csdn.net/rjdeng/article/details/139654539

相关文章

  • Android开发 - LayoutParams解析
    LayoutParams翻译过来就是布局参数,子View通过LayoutParams告诉父容器(ViewGroup)应该如何放置自己。从这个定义中也可以看出来LayoutParams与ViewGroup是息息相关的,因此脱离ViewGroup谈LayoutParams是没有意义的。事实上,每个ViewGroup的子类都有自己对应的LayoutParams类,典型的如L......
  • android audio不同音频流,(六)settings内音频流音量调整
    (1)settings内,可设置音频流音量,如下图:(2)settings调整音量条进度,会触发SeekBarVolumizer对象:SeekBarVolumizer文件路径:frameworks/base/core/java/android/preference/SeekBarVolumizer.javaSeekBarVolumizer对象,handle会接到MSG_SET_STREAM_VOLUME事件:publicbooleanhandl......
  • android在一个TextView中设置不同字体大小、不同字体颜色封装
    一、概述在开发过程中遇到过这样一种业务,有很多单行文本字体。字符串中每一部分的字体样式、大小、颜色都不相同。传统的做法是放多个TextView以达到效果。但是当这个页面中的这样的元素非常多,且非常复杂的时候,就会出现页面加载缓慢的问题(view加载=深度(递归)+平铺),也就是......
  • Android开发 - Context解析
    Context是什么Context的中文翻译为:语境;上下文;背景;环境,在开发中我们经常说称之为“上下文”,那么这个“上下文”到底是指什么意思呢?在语文中,我们可以理解为语境,在程序中,我们可以理解为当前对象在程序中所处的一个环境,一个与系统交互的过程。比如微信聊天,此时的“环境”是指......
  • Android开发 - Bundle传值的理解与使用
    什么是BundleBundle经常出现在以下场合:Activity状态数据的保存与恢复涉及到的两个回调:voidonSaveInstanceState(BundleoutState)voidonCreate(BundlesavedInstanceState)Fragment的setArguments方法:voidsetArguments(Bundleargs)消息机制中的Message的setData......
  • Android 常见面试题(一)
    Android常见面试题(一)1、java中==和equals和hashCode的区别基本数据类型的==比较的值相等.类的==比较的内存的地址,即是否是同一个对象。在不重写equals方法的情况下,equals同比较内存地址,原实现也为==,如String等重写了equals方法,会判断字符串里的值是否相等......
  • Android4.4.4双声卡同时出声
    在调试RK3288Android4.4.4,该方案默认配置上SPDIF时HDMI就没声音,但客户需求是同时要有声音的,于是驱动配置上后,呈现两个声卡状态,此时需要通过修改HAL层来处理(RK3288Android4.4.4对应的HAL层源码为hardware/rk29/audio目录),修改如下:1.修改AudioHardware.cpp文件,在AudioHardware:......
  • Android或iOS 与 REST/SOAP测试 工具推荐
    移动测试工具- 有助于自动测试Android或iOS应用程序1)AppiumAppium是用于移动应用程序自动化的开源测试工具之一。它允许用户测试各种原生、移动、web和混合应用程序。它还支持模拟器和模拟器上的自动测试。功能特点:这是一个简单的应用程序,需要很少的内存用于测试过程......
  • Android笔试面试题AI答之控件Views(3)
    答案仅供参考,来自文心一言目录1.如何在ListView间添加分割线?方法1:在XML布局文件中设置方法2:在Java代码中设置注意事项2.如何实现ListView的逐行显示?1.使用`Handler`和`postDelayed()`方法2.监听滚动事件3.自定义Adapter4.使用`RecyclerView`代替`ListVie......
  • Android 14 适配之— BluetoothAdapter、JobScheduler、 Tiles
    1. BluetoothAdapter改动:在BluetoothAdapter中必须加入 BLUETOOTH_CONNECT权限 Android14(API级别34)或更高版本为目标的App,在调用函数 BluetoothAdapter getProfileConnectionState() 时,需要 BLUETOOTH_CONNECT 权限,<uses-permissionandroid:name="android......