Android Framework 面试系列(八)ContentProvider

ContentProvider (内容提供者) 属于四大组件之一,它的作用就是进程间进行数据交互,底层采用 Binder 机制进行进程间通信。这篇文章介绍 Provider 是如何启动的。

Provider 进程未启动时

  • 首先应用向Provider发起增删改查的调用,但由于不是同一进程,就需要先拿到binder对象,因此先要向AMS请求Provider的binder对象
  • AMS发现Provider所在的进程还没启动,AMS将通过socket向Zygote发起创建进程请求
  • Zygote收到请求后将会把Provider所在的进程启动起来
  • 应用进程启动后首先会调用attachApplication向AMS报告,AMS就知道进程就绪了
  • AMS接着向进程发起bindApplication指令:通知进程创建applicaiton,并安装provider
  • 进程安装provider包括:创建provider对象、调用它们的onCreate生命周期、并最终把provider的binder对象通过publishContentProvider发布到AMS,这样AMS就持有Provider的binder对象了
  • AMS把Provider发布的binder对象返回给应用
  • 应用就可能用binder对象对provider发起增删改查的调用了

Provider 进程已启动时

  • 应用向Provider发起增删改查调用,应用向AMS请求Provider的binder对象
  • AMS发现自己并没有Provider的binder对象,于是通过scheduleInstallProvider调用向Provider请求
  • Provider进程收到请求后将安装Provider、调用它的onCreate生命周期,最后把binder对象发布到AMS AMS把Provider的binder对象返回给应用
  • 应用拿到这个binder就可以进行增删改查了

Provider 运行的进程

情况1:provider不能跑在调用者的进程

  1. 应用要对Provider进程增删改查需要先拿到Provider的binder对象(因为不是同一个进程,所以需要跨进程通信)
  2. Provider启动后先把binder发布到AMS
  3. 应用向AMS请求的时候AMS就把Provider的binder返回给应用

情况2:provider可以跑在调用者的进程

  1. 没有直接使用Provider的binder对象,而是在应用进程中创建一个Provider实例
  2. Provider所在进程的uid必须要与调用者的uid相同
  3. 同时还要满足:Provider的进程名称与调用者的进程名相同,或者Provider指定了multiprocess标记

参考

相关推荐
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo2 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077002 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼2 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen2 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone2 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui