Android ContentProvider详解
来源:互联网 发布:php 获取视频预览图 编辑:程序博客网 时间:2024/06/11 23:34
一.Android四大组件
Android四大组件是Activity, Service, Content Provider, Broadcast Receiver。
Activity作为程序界面,直接与用户交互
Service运行在后台,没有界面,完成特定的功能
ContentProvider维护应用数据,方便应用本身或其它应用访问
Broadcast Receiver提供异步广播消息接收机制,便于各应用/组件进行交互
通过AndroidManifest.xml,
二. 什么是ContentProvider
Content Provider维护特定的应用数据,并可以让其它应用轻松访问该数据。对数据使
用者来说它是数据提供者。它提供统一的接口对数据进行操作,使用者不用关心数据到底是如何存储的以及数据类型到底是什么。也就是说,Content Provider作为数据提供者,提供了对外共享本地数据一种机制,使Android应用能方便地基于该机制进行数据访问。
content://contacts/people表示要操作ContentProvider为contacts下的people表
content://com.android.contacts/people/#表示要操作表people中特定id的行(记录)。
content://downloads/download/10/name表示要操作id为10的行的name字段。
content://downloads/download/*表示操作download表中的所有字段。
总之,#匹配一个数字字符串,*匹配一个文本字符串。
三.ContentProvider 的实现和使用
四. ContentProvider内部机制
1.ContentProvider接口调用过程
服务。虽然ContentProvider的用法以及表现形式不是一个Service,实际上它可以看作是ActivityManagerService提供的一种服务, 它实现了IBinder接口。
2.ContentProvider实例创建过程
1) 对于android:multiprocess=true的ContentProvider,意味着可以多实例,那么由调用者在自己的进程空间实例化一个ContentProvider对象,此时定义ContentProvider的App可能并没有启动
注意:ContentProvider是否多实例,还得看contentProvider的uid与调用者的uid是否相同或contentProvider的uid是System user。具体逻辑是:
public boolean canRunHere(ProcessRecord app) {
}
2)对于android:multiprocess=false(默认值)的ContentProvider,由系统把定义该ContentProvider的App启动起来(一个独立的Process)并实例化ContentProvider,这种ContentProvider只有一个实例,运行在自己App的Process中。所有调用者共享该ContentProvider实例,调用者与ContentProvider实例位于两个不同的Process
其中Process.start()->zygoteSendArgsAndGetPid()->ZygoteInit.runSelectLoopMode()
-> ZygoteConnection.runOnce() -> Zygote.forkAndSpecialize()->RuntimeInit.zygoteInit()
-> invokeStaticMain()->MethodAndArgsCaller.run()->Method.invokeNative
->ActivityThread.main(),这是通用的APK启动流程。
3)ContentProvider的加载/发布过程
AMS根据thread信息更新进程记录(ProcessRecord)并调用thread的bindApplication()进行初始化工作并创建ApplicationContext和Application实例,然后安装package里声明的所有contentProvider。 主要过程如下:
AMS维护了很多信息,其中比较重要的有:
mProcessNames:
mProvidersByName:
mProvidersByClass:
conProviders:属于ProcessRecord信息,特定Process正在使用的ContentProvider及其个数映射表
pubProviders:属于ProcessRecord信息,特定Process已经Published的Provider类名和Provider信息
ActivityThread维护了3个与ContentProvider相关的Map:
mProviderMap:
mProviderRefCountMap:
mLocalProviders:
4)ContentProvider通知机制
注意:这个通知机制需要ContentProvider的实现者在实现insert/delete/query/update接口时调用ContentResolver的notifyChange(), 否则没法实现数据变化的通知。
- Android之ContentProvider详解
- android ContentProvider使用详解
- Android Contentprovider机制详解
- Android之ContentProvider详解
- android ContentProvider使用详解
- Android ContentProvider详解
- Android ContentProvider详解
- Android ContentProvider使用详解
- android ContentResolver ContentProvider 详解
- Android之ContentProvider详解
- android contentprovider 详解
- Android之ContentProvider详解
- android之ContentProvider详解
- Android之ContentProvider详解
- android contentprovider详解
- Android ContentProvider使用详解
- Android ContentProvider详解
- Android之ContentProvider详解
- Window 命令行 查看端口占用、杀死进程等的命令
- Python Challenge 通关攻略
- LeetCode: Balanced Binary Tree
- 打印字符串所有字串
- 最长公共子串问题
- Android ContentProvider详解
- android 资源使用
- Eclipse Error: Failed To Create the Java Virtual Machine
- juce中的ComponentDragger
- 倒排文件索引(Inverted File Index)的建立
- PAT (Advanced) 1014. Waiting in Line (30)
- Navicat for MySQL 9.1.6 Enterprise 注册码:
- sql
- POJ 2387 Til the Cows Come Home