Android四大组件-ContentProvider

tip:ContentProvider的onCreate要先于Application的onCreate来执行
当我们启动一个Activity时候,首先会从ActivityThread的main方法开始,这是一个静态方法,在这个方法里面会创建IApplicationThread对象(Binder),并把它传给AMS,通过这个Binder,AMS就能调用ApplicaitonThread中的方法。根据启动流程AMS首先会调用ApplicationThread中的bindApplication方法,这个方法里面主要发了一个消息:
在这里插入图片描述
接着这个消息会被ActivityThread的handler类H所拦截,拦截到消息后调用handleBindApplication方法,在这个方法里面会调用
在这里插入图片描述
这是一个ContentProvider的粗略启动过程,后面再详解

我们在使用ContentProvider首先需要获得ContentResolver对象,一般是通过getContentResolver这个方法来获得,这个方法的具体实现在ContextImpl中,代码如下:
在这里插入图片描述
返回了mContentResolver,这个的类型从它的定义中可以看出:
在这里插入图片描述
其实它就是一个ApplicationContentResolver对象,这个ApplicationContextResolver是ContextImpl的内部类

首先,contentProvider的创建源自于我们对它的访问,一般就是通过它的四个方法来访问它,这里从query展开,其他方法类似。当我们调用getContentResolver.query方法时候,其实就是调用ApplicationContentResolver的query方法,这个方法的实现在它的父类ContentResolver中,代码路径如下:frameworks/base/core/java/android/content/ContentResolver.java
在这里插入图片描述
其实无论是调用acquireProvider还是acquireUnstableProvider本质上最后都是调用acquireProvider,在ApplicationContentResolver中可以看到acquireProvider方法实现如下:
在这里插入图片描述
可以看到直接调用了ActivityThread的acquireProvider这个方法,代码如下:
在这里插入图片描述
AMS启动ContentProvider所在进程后,众所周知:进程的入口方法是ActivityThread的main方法,在ActivityThread的main方法中,有以下两行代码:
在这里插入图片描述
接下来进入到ActivityThread的attach方法中
在这里插入图片描述
接下来来到AMS的attachApplication,代码如下:
在这里插入图片描述
在AMS的attachApplicationLocked中,会调用ApplicationThread的bindApplication方法:代码如下
在这里插入图片描述
bindApplication只是发送了一个消息,这个消息被H接收后会调用ActivityThread的handleBindApplication方法,handleBindApplication中会调用以下代码:
在这里插入图片描述
代码实现如下:
在这里插入图片描述
接下来看看contentProvider对象的创建,进入installProvider方法,代码如下:
在这里插入图片描述

首先通过类加载器创建出contentprovider对象,然后调用其attachInfo方法,attachInfo这个方法的实现在ContentProvider.java中,代码如下:
在这里插入图片描述
可以看到contentProvider的初始化方法已经被调用

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值