1、ContentProvider背景
Android系统是基于Linux系统内核来进行开发的,在Linux中,文件具备一系列的属性,其中最重要的莫过于文件权限了。关于文件权限,其实就是文件的读写,执行操做的权限。它能够指定不一样的用户,不用的用户组对同一文件的操做权限。Android继承了Linux的文件管理方式,通常每一个应用程序都是独立的进程,也就是不一样的用户。它会为每一个应用程序分配独立的用户ID和用户组ID.而由这个应用程序建立出来的文件则赋予了相应用户的读写权限,其余用户,也就是其余应用程序无权读写。android
可是,依然有共享数据的需求存在,好比A要读取通信录或者要读取B应用的数据,那必须有一套比较友好的机制来实现这个进程间数据共享的问题。ide
而ContentProvider就是Android系统下,专门用以处理这个需求的。ui
2、ContentProvider简介
ContentProvider是Android四大组件之一,能够提供数据给应用程序。ContentProvider能够提供数据在进程之间共享。
上面这些话基本上都是ContentProvider的文档说明,不过今天咱们讨论的不是这些,咱们要讨论的是ContentProvider的初始化过程。ContentProvider采用的是懒汉式初始化过程,只有在使用的时候才会去初始化。
线程
3、ContentProvider工做于非主线程
ContentResolver与ContentProvider类隐藏了实现细节,可是ContentProvider所提供的query(),insert(),delete(),update()都是在ContentProvider进程的线程池中被调用执行的,而不是进程的主线程中。由于那些方法可能同时被多个线程所调用,因此他们的数据同步问题,要在实现逻辑中实现好。
ContentProvider实现了进程间通讯也是基于Binder机制的,因此会回到Binder的线程处理问题。并非每一个ContentProvider都会有一个线程池,而一个进程会共有一个线程池,其实就是Binder线程池。
4、ContentProvider启动细节
4.一、contentProvider的初始化是在它本身进程的主线程里面完成,通常发生在有人第一次访问这个contentProvider或者这个contentProvider进程第一次启动,好比这个进程有个service,开机启动,那么随着servier启动的还有contentProvider.
4.二、 contentProvider有个android:multiProcess属性,用来配置是否在多个进程里面,有不一样的实例。若是为true,那么它就会在每一个访问这个contentProvider的进程里面生成一个对象。这个时候调用contentProvider,就是哪一个线程调用的,contentProvider就运行在那个线程里面。
若是这个值配置为false,那么多个进程之间共享一个contentProvider,经过binder来进行进程之间对象传递。若是多个进程同时访问,会为每一个访问请求分配个线程。因此,这些操做,好比查询,不会运行在contentProvider进程的主线程。
4.三、 contentProvider查询等操做是否须要等待,须要binder来设置。
4.四、contentProvider查询的数据传递是经过ashmem来完成的。