ContentProvider要点

2020-10-13  本文已影响0人  taoyyyy

ContentProvider#onCreate的调用时机

Application#attachBaseContext()
-> ContentProvide#onCreate()
-> Application#onCreate()

ActivityThread#handleBindApplication

image.png

ContentProvider的onCreate和CRUD运行在哪个线程?它们是线程安全的吗?

Context.getContentResolver#query的流程

1、ContextImpl.getContentResolver()返回的是ApplicationContentResolver
2、ActivityThread.acquireProvider()首先检查是否已经存在目标ContentProvider,如果有就直接返回它,如果没有则请求AMS启动。
3、ActivityManagerService的getContentProviderImpl方法干了很多事情,我们看重点,如果process已经启动了则proc.thread.scheduleInstallProvider(cpi),否则proc = startProcessLocked(),这里我们看后面一种情况。
4、ActivityManagerService.startProcessLocked完成新进程的启动。然后走到ActivityThread.main()
5、ActivityThread.handleBindApplication()主要工作:
5.1、创建ContentImpl
final ContextImpl appContext = ContextImpl.createAppContext(this, data.info);
5.2、创建Instrumentation
mInstrumentation = (Instrumentation) cl.loadClass(data.instrumentationName.getClassName()).newInstance();
mInstrumentation.init(this, instrContext, appContext, component, data.instrumentationWatcher, data.instrumentationUiAutomationConnection);
5.3、创建Application对象
app = data.info.makeApplication(data.restrictedBackupMode, null );
5.4、启动当前进程的ContentProvider
installContentProviders(app, data.providers)
5.4.1 installProvider方法反射实例化ContentProvider对象,同时也实例化了ContentProvider的成员变量mTransport。

上一篇 下一篇

猜你喜欢

热点阅读