Android内容提供程序中多个进程的多次写入

Posted

技术标签:

【中文标题】Android内容提供程序中多个进程的多次写入【英文标题】:Multiple write from multiple process in Android Content provider 【发布时间】:2019-11-23 13:35:28 【问题描述】:

我知道 android 的 ContentProvider 以多进程/多线程的多次写入而闻名,而不会引发锁定异常。在多线程环境中,它可能已经使用读写锁同步了方法。但是,将创建多个对象的多进程呢?谁能让我在 ContenProvider 内部工作。

【问题讨论】:

【参考方案1】:

ContentProvider 是一个清单声明的组件,它由操作系统实例化并与主进程绑定(除非属性process 指定不同)。因此,在该应用程序进程的生命周期内,仅创建声明的ContentProvider 的单个实例。希望与之交互的其他进程必须通过ContentResolver,而ContentResolver 又只与创建的单个提供程序进行通信。

请注意,当从另一个进程使用提供程序时,它通过 IPC(特别是通过 Binders)进行通信,这意味着在 IPC 调用期间将在 BinderThread 中调用提供程序的方法。有一个绑定线程池,因此可以与多个应用程序进行一些并发通信,这意味着应该进行适当的同步。

总之,内容提供者对于多进程和多线程交互是安全的,因为:

    他们是单身人士。 多线程安全由开发人员通过适当的共享状态同步来保证。 ContentProvider 保证多进程安全。 ContentProvider 的定义具有适合 IPC 交互的返回类型。 (它们是 Parcelable,例如 AssetFileDescriptor,或者它们是由使用 ashmem 分配的共享内存支持的 SQLiteCursor。

【讨论】:

以上是关于Android内容提供程序中多个进程的多次写入的主要内容,如果未能解决你的问题,请参考以下文章

Android系统是在一个进程中多次向多个接收者发送BOOT_COMPLETED意图还是一次?

Android:内容观察者的“onChange()”方法被多次调用

android: 内容提供器简介

多次按下按钮加载多个页面(Android)

在多个进程写入时读取命名管道

使用Android中的内容提供程序公开多个表的最佳实践