一、ContentProvider背景

Android系统是基于Linux系统内核来进行开发的,在Linux中,文件具有一系列的属性,其中最重要的莫过于文件权限了。关于文件权限,其实就是文件的读写,执行操作的权限。它可以指定不同的用户,不用的用户组对同一文件的操作权限。Android继承了Linux的文件管理方式,一般每个应用程序都是独立的进程,也就是不同的用户。它会为每个应用程序分配独立的用户ID和用户组ID.而由这个应用程序创建出来的文件则赋予了相应用户的读写权限,其他用户,也就是其他应用程序无权读写。

但是,依然有共享数据的需求存在,比如A要读取通讯录或者要读取B应用的数据,那必须有一套比较友好的机制来实现这个进程间数据共享的问题。

而ContentProvider就是Android系统下,专门用以处理这个需求的。

二、ContentProvider简介

ContentProvider是Android四大组件之一,可以提供数据给应用程序。ContentProvider可以提供数据在进程之间共享。
上面这些话基本上都是ContentProvider的文档说明,不过今天我们讨论的不是这些,我们要讨论的是ContentProvider的初始化过程。ContentProvider采用的是懒汉式初始化过程,只有在使用的时候才会去初始化。

三、ContentProvider工作于非主线程

ContentResolver与ContentProvider类隐藏了实现细节,但是ContentProvider所提供的query(),insert(),delete(),update()都是在ContentProvider进程的线程池中被调用执行的,而不是进程的主线程中。因为那些方法可能同时被多个线程所调用,所以他们的数据同步问题,要在实现逻辑中实现好。
ContentProvider实现了进程间通信也是基于Binder机制的,所以会回到Binder的线程处理问题。并不是每个ContentProvider都会有一个线程池,而一个进程会共有一个线程池,其实就是Binder线程池。
 

四、ContentProvider启动细节

4.1、contentProvider的初始化是在它自己进程的主线程里面完成,一般发生在有人第一次访问这个contentProvider或者这个contentProvider进程第一次启动,比如这个进程有个service,开机启动,那么随着servier启动的还有contentProvider.
4.2、 contentProvider有个android:multiProcess属性,用来配置是否在多个进程里面,有不同的实例。如果为true,那么它就会在每个访问这个contentProvider的进程里面生成一个对象。这个时候调用contentProvider,就是哪个线程调用的,contentProvider就运行在那个线程里面。
如果这个值配置为false,那么多个进程之间共享一个contentProvider,通过binder来进行进程之间对象传递。如果多个进程同时访问,会为每个访问请求分配个线程。所以,这些操作,比如查询,不会运行在contentProvider进程的主线程。
4.3、 contentProvider查询等操作是否需要等待,需要binder来设置。
4.4、contentProvider查询的数据传递是通过ashmem来完成的。

 

最新文章

  1. 用VC编译lua源码,生成lua语言的解释器和编译器
  2. 【翻译二十二】java-并发之集合与原子变量
  3. backbone学习笔记一
  4. paip.c++ 转换 java 解决方案
  5. ExtJs自学教程(1):一切从API開始
  6. 名片管理系统v1.1(tools)
  7. ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门
  8. [转]Linux操作系统tcpdump抓包分析详解
  9. 洛谷P2831 愤怒的小鸟 + 篮球比赛1 2
  10. Python学习(十七)—— 数据库(二)
  11. Codeforces 862D. Mahmoud and Ehab and the binary string 【二分】(交互)
  12. 手把手教你如何用eclipse搭建前端开发环境
  13. 机器C盘临时区
  14. C++ 智能指针四
  15. Struts 2 初步入门(二)
  16. python+xpath+requests爬取维基百科历史上的今天
  17. 【RF库测试】Variable Should not Exist & variable should exist
  18. Linux下Java性能监控
  19. html学习第一天
  20. 20181120-6 Beta阶段第2周/共2周 Scrum立会报告+燃尽图 03

热门文章

  1. wordpress后台加载速度异常缓慢排查记录(原创)
  2. xpath语法规则
  3. 【LOJ】 #2132. 「NOI2015」荷马史诗
  4. loadrunner场景中按scenario和group执行的区别
  5. 最大公约数or最小公倍数
  6. 实验吧 recursive write up
  7. codevs 1044 拦截导弹 1999年NOIP全国联赛提高组
  8. 【刷水-二分答案】BZOJ1650 & BZOJ1639
  9. hdu 4790 Just Random
  10. Java高级架构师(一)第42节:应用上Nginx过后的体系结构