zoukankan      html  css  js  c++  java
  • ContentProvider的那些小事(纯结论)

    一、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来完成的。
     
  • 相关阅读:
    GitHub Pages 绑定二级域名
    JS正则表达式(JavaScript regular expression)
    天猫魔盒远程安装APP
    'msbuild.exe' 不是内部或外部命令,也不是可运行的程序
    Jenkins自动更新与数据备份
    Jenkins插件无法更新、Jenkins插件不能下载问题解决
    安全测试工具wapiti的安装和使用(2)命令及参数解释
    安全测试工具wapiti的安装和使用(1)安装
    Jenkins远程构建和发布,基于IIS服务器(.netCore+vue)(三)
    Jmeter报错:java.net.ConnectException: Connection timed out: connect
  • 原文地址:https://www.cnblogs.com/wytings/p/9352130.html
Copyright © 2011-2022 走看看