- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Android应用程序组件Content Provider在应用程序之间共享数据的原理分析
在Android系统中,不同的应用程序是不能直接读写对方的数据文件的,如果它们想共享数据的话,只能通过Content Provider组件来实现。那么,Content Provider组件又是如何突破应用程序边界权限控制来实现在不同的应用程序之间共享数据的呢?在前面的文章中,我们已经简要介绍过它是通过Binder进程间通信机制以及匿名共享内存机制来实现的,在本文中,我们将详细分析它的数据共享原理。
Android应用程序之间不能直接访问对方的数据文件的障碍在于每一个应用程序都有自己的用户ID,而每一个应用程序所创建的文件的读写权限都是只赋予给自己所属的用户,因此,就限制了应用程序之间相互读写数据的操作,关于Android应用程序的权限问题,具体可以参考前面一篇文章 。通过前面 等一系列文章的学习,我们知道,Binder进程间通信机制可以突破了以应用程序为边界的权限控制来实现在不同应用程序之间传输数据,而Content Provider组件在不同应用程序之间共享数据正是基于Binder进程间通信机制来实现的。虽然Binder进程间通信机制突破了以应用程序为边界的权限控制,但是它是安全可控的,因为数据的访问接口是由数据的所有者来提供的,换句话来说,就是数据提供方可以在接口层来实现安全控制,决定哪些数据是可以读,哪些数据可以写。虽然Content Provider组件本身也提供了读写权限控制,但是它的控制粒度是比较粗的,如果有需要,我们还是可以在接口访问层做更细粒度的权限控制以达到数据安全的目的。
Binder进程间通信机制虽然打通了应用程序之间共享数据的通道,但是还有一个问题需要解决,那就是数据要以什么来作来媒介来传输。我们知道,应用程序采用Binder进程间通信机制进行通信时,要传输的数据都是采用函数参数的形式进行的,对于一般的进程间调来来说,这是没有问题的,然而,对于应用程序之间的共享数据来说,它们的数据量可能是非常大的,如果还是简单的用函数参数的形式来传递,效率就会比较低下。通过前面 等一系列文章的学习,我们知道,在应用程序进程之间以匿名共享内存的方式来传输数据效率是非常高的,因为它们之间只需要传递一个文件描述符就可以了。因此,Content Provider组件在不同应用程序之间传输数据正是基于匿名共享内存机制来实现的。
在继续分析Content Provider组件在不同应用程序之间共享数据的原理之前,我们假设应用程序之间需要共享的数据是保存在数据库(SQLite)中的,因此,接下来的分析都是基于SQLite数据库游标(SQLiteCursor)来进行的。SQLiteCursor在共享数据的传输过程中发挥着重要的作用,因此,我们先来它和其它相关的类的关系图,如下所示:
首先在第三方应用程序这一侧,当它需要访问Content Provider中的数据时,它会在本进程中创建一个CursorWindow对象,它在内部创建了一块匿名共享内存,同时,它实现了Parcel接口,因此它可以在进程间传输。接下来第三方应用程序把这个CursorWindow对象(连同它内部的匿名共享内存文件描述符)通过Binder进程间调用传输到Content Provider这一侧。这个匿名共享内存文件描述符传输到Binder驱动程序的时候,Binder驱动程序就会在目标进程(即Content Provider所在的进程)中创建另一个匿名共享文件描述符,指向前面已经创建好的匿名共享内存,因此,就实现了在两个进程中共享同一块匿名内存,这个过程具体可以参考 一文。
在Content Provider这一侧,利用在Binder驱动程序为它创建好的这个匿名共享内存文件描述符,在本进程中创建了一个CursorWindow对象。现在,Content Provider开始要从本地中从数据库中查询第三方应用程序想要获取的数据了。Content Provider首先会创建一个SQLiteCursor对象,即SQLite数据库游标对象,它继承了AbstractWindowedCursor类,后者又继承了AbstractCursor类,而AbstractCursor类又实现了CrossProcessCursor和Cursor接口。其中,最重要的是在AbstractWindowedCursor类中,有一个成员变量mWindow,它的类型为CursorWindow,这个成员变量是通过AbstractWindowedCursor的子类SQLiteCursor的setWindow成员函数
您可能关注的文档
- ABS ESP BOSCH版课件要点.ppt
- Agilent_34972A操作说明要点.ppt
- AE地图的显示要点.ppt
- Adobe Premiere CS3教程大全要点.ppt
- AKI的研究进展与CRRT的抗生素使用原则要点.ppt
- ALLEGRO_PCBLA_YOUT_教程要点.ppt
- AIP全文数据库使用指南要点.ppt
- An Invitation Card --邀请卡要点.ppt
- Android WebView执行GPU命令的过程要点.doc
- Android基础要点.docx
- 浙江省温州市浙南名校联盟2025-2026学年高一上学期期中联考数学试题含解析.docx
- 26高考数学提分秘诀重难点34圆锥曲线中的定点、定值、定直线问题(举一反三专项训练)(全国通用)(含解析).docx
- 26高考数学提分秘诀重难点35概率与统计的综合问题(举一反三专项训练)(全国通用)(含解析).docx
- 26高考数学提分秘诀重难点31圆锥曲线中的切线与切点弦问题(举一反三专项训练)(全国通用)(含解析).docx
- 26高考数学提分秘诀重难点30圆锥曲线中的弦长问题与长度和、差、商、积问题(举一反三专项训练)(全国通用)(含解析).docx
- 26高考数学提分秘诀重难点29巧解圆锥曲线的离心率问题(举一反三专项训练)(全国通用)(含解析).docx
- 26高考数学提分秘诀重难点28直线与圆的综合(举一反三专项训练)(全国通用)(含解析).docx
- 寡核苷酸药物重复给药毒性研究技术指南.docx
- 重组溶瘤腺病毒生产质量管理标准.docx
- 26高考数学提分秘诀重难点27直线与圆中常考的最值与范围问题(举一反三专项训练)(全国通用)(含解析).docx
最近下载
- 2025年注册信息系统安全专家(CISSP)考试题库(附答案和详细解析)(1010).docx VIP
- 《苯二氮卓类药物的合成》课件.ppt VIP
- 2025黑龙江专升本植物学考试真题 .pdf VIP
- CISSP信息系统安全工程师认证考试题库.pdf VIP
- CISSP_Official_PRACTICE_TESTS考试认证题库.docx VIP
- 集装箱正面吊运机液压系统设计主要性能试验研究与应用.pdf VIP
- tissin_positioner_ts900-manual_c调试详细步骤.pdf VIP
- 危化品车辆运输安全培训课件.pptx VIP
- 2025广西公需科目考试答案(3套涵盖95-试题)一区两地一园一通道建设人工智能时代的机遇与挑战.docx
- 2025秋沪教牛津新七年级上知识点清单(背诵版) .pdf VIP
原创力文档


文档评论(0)