hook_contentprovider
2017-01-15 21:00:49 0 举报
`hook_contentprovider`是Drupal中的一个重要钩子,它允许开发者在内容提供者(Content Provider)的生命周期中插入自定义的行为。通过实现这个钩子,你可以在创建、读取、更新或删除内容时执行特定的操作,例如添加额外的验证、修改数据结构或者处理特殊的业务逻辑。这使得开发者能够根据项目需求灵活地扩展Drupal的核心功能,提高系统的可定制性和扩展性。
作者其他创作
大纲/内容
IContentProvider unstableProvider=acquireUnstableProvider(uri);
如果查询的ContentProvider所在进程处于运行状态,那么AMS会通过这个进程给AMS的ApplicationThread这个Binder对象完成scheduleInstallProvider调用,最终会调用到目标进程的installProvider方法
ContextImpl.getContentResolver()
ActivityThread.acquireProvider()
AMS.getContentProviderImpl()
如果ContentProvider所在的进程已经死亡,那么会调用startProcessLocked来启动新的进程,startProcessLocked有一系列重载函,最终会通过socket让Zygote进程fork出一个子进程,然后通过反射调用了之前传递过来的一个入口类的main函数(一般这个类就是ActivityThread)
ContentResolver.query()
ActivityManagerNative.getContentProvider()
但是这样的话只有通过插件进程启动的进程,才能查询到这个ContentProvider;要让所有进程都能查询到,还是需要将信息注册到AMS中
final PackageParser.Provider provider=mProvidersByAuthority.get(name);
ApplicationContentResolver.acquireUnstableProvider()ApplicationContentResolver.acquireProvider()
这里就分两种情况:其一,DemoB这个App已经在运行了,那么AMS直接通知DemoB安装ContentProviderAppB(如果B已经安装了那就更好了);其二,DemoB这个app没在运行,那么必须把B进程唤醒,让它干活;这个过程也就是ActivityManagerService的getContentProviderImpl方法所做的
ApplicationContentResolver
ContentResolver
Context.getContentResolver()
scanPackageDirtyLI()
查找mProvidersByAuthority.put()方法
PackageManagerService.resolveContentProvider()
ActivityThread.handleBindApplication()
resolver.query()
ActivityThread.main()
final ProviderClientRecord pr=mProviderMap.get(key);...installProvider()
AMS.getContentProvider()
0 条评论
下一页