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标记

参考

相关推荐
LT101579744417 分钟前
2026年手机机型兼容性测试选型指南:安卓机型碎片化、APP闪退UI错乱如何解决
android·测试工具·ui·智能手机
阿pin1 小时前
Android随笔-view是如何显示到屏幕上
android·view
恋猫de小郭1 小时前
Flutter material/cupertino 解耦最新进展,已经在做新样式了
android·前端·flutter
在书中成长1 小时前
HarmonyOS 小游戏《对战五子棋》开发第17篇 - AI的两种评估策略
android·java·javascript
私人珍藏库2 小时前
[Android] Npatch-免Root框架+可内置模块
android·人工智能·智能手机·工具·软件
黄林晴2 小时前
KMP 正式支持 SwiftPM:CocoaPods 迁移配置指南
android·ios·kotlin
AFinalStone3 小时前
Android 7系统网络(二)内核层—netfilter_iptables与路由策略
android·网络
吠品3 小时前
Mac定时关机、开机自动化:用shutdown和pmset就够了
android·java·开发语言
2601_9637713718 小时前
Offloading WP-Cron and Securing Ticket Webhooks on Enterprise IT Sites
android
花燃柳卧19 小时前
跨平台路由组件工程源码补充上传
android·flutter·kotlin