Android应用程序组件Content Provider的启动过程源代码分析(6)
- public final class ActivityThread {
- ......
- private final IContentProvider installProvider(Context context,
- IContentProvider provider, ProviderInfo info, boolean noisy) {
- ContentProvider localProvider = null;
- if (provider == null) {
- ......
- Context c = null;
- ApplicationInfo ai = info.applicationInfo;
- if (context.getPackageName().equals(ai.packageName)) {
- c = context;
- } else if (mInitialApplication != null &&
- mInitialApplication.getPackageName().equals(ai.packageName)) {
- c = mInitialApplication;
- } else {
- try {
- c = context.createPackageContext(ai.packageName,
- Context.CONTEXT_INCLUDE_CODE);
- } catch (PackageManager.NameNotFoundException e) {
- }
- }
- ......
- try {
- final java.lang.ClassLoader cl = c.getClassLoader();
- localProvider = (ContentProvider)cl.
- loadClass(info.name).newInstance();
- provider = localProvider.getIContentProvider();
- ......
- // XXX Need to create the correct context for this provider.
- localProvider.attachInfo(c, info);
- } catch (java.lang.Exception e) {
- ......
- }
- } else if (localLOGV) {
- ......
- }
- synchronized (mProviderMap) {
- // Cache the pointer for the remote provider.
- String names[] = PATTERN_SEMICOLON.split(info.authority);
- for (int i=0; i<names.length; i++) {
- ProviderClientRecord pr = new ProviderClientRecord(names[i], provider,
- localProvider);
- try {
- provider.asBinder().linkToDeath(pr, 0);
- mProviderMap.put(names[i], pr);
- } catch (RemoteException e) {
- return null;
- }
- }
- if (localProvider != null) {
- mLocalProviders.put(provider.asBinder(),
- new ProviderClientRecord(null, provider, localProvider));
- }
- }
- return provider;
- }
- ......
- }
- final java.lang.ClassLoader cl = c.getClassLoader();
- localProvider = (ContentProvider)cl.
- loadClass(info.name).newInstance();
- public abstract class ContentProvider implements ComponentCallbacks {
- ......
- private Transport mTransport = new Transport();
- ......
- class Transport extends ContentProviderNative {
- ......
- }
- public IContentProvider getIContentProvider() {
- return mTransport;
- }
- ......
- }
回到前面的installProvider函数中,它接下来调用下面接口来初始化刚刚加载好的Content Provider:
- // XXX Need to create the correct context for this provider.
- localProvider.attachInfo(c, info);
- public abstract class ContentProvider implements ComponentCallbacks {
- ......
- public void attachInfo(Context context, ProviderInfo info) {
- /*
- * Only allow it to be set once, so after the content service gives
- * this to us clients can't change it.
- */
- if (mContext == null) {
- mContext = context;
- mMyUid = Process.myUid();
- if (info != null) {
- setReadPermission(info.readPermission);
- setWritePermission(info.writePermission);
- setPathPermissions(info.pathPermissions);
- mExported = info.exported;
- }
- ContentProvider.this.onCreate();
- }
- }
- ......
- }
- public class ArticlesProvider extends ContentProvider {
- ......
- @Override
- public boolean onCreate() {
- Context context = getContext();
- resolver = context.getContentResolver();
- dbHelper = new DBHelper(context, DB_NAME, null, DB_VERSION);
- return true;
- }
- ......
- }
- synchronized (mProviderMap) {
- // Cache the pointer for the remote provider.
- String names[] = PATTERN_SEMICOLON.split(info.authority);
- for (int i=0; i<names.length; i++) {
- ProviderClientRecord pr = new ProviderClientRecord(names[i], provider,
- localProvider);
- try {
- provider.asBinder().linkToDeath(pr, 0);
- mProviderMap.put(names[i], pr);
- } catch (RemoteException e) {
- return null;
- }
- }
- if (localProvider != null) {
- mLocalProviders.put(provider.asBinder(),
- new ProviderClientRecord(null, provider, localProvider));
- }
- }
Android应用程序组件Content Provider的启动过程源代码分析(6)相关推荐
- Android应用程序组件Content Provider的启动过程源代码分析(1)
通过前面的学习,我们知道在Android系统中,Content Provider可以为不同的应用程序访问相同的数据提供统一的入口.Content Provider一般是运行在独立的进 ...
- Android应用程序组件Content Provider的共享数据更新通知机制分析
在Android系统中,应用程序组件Content Provider为不同的应用程序实现数据共享提供了基础设施,它主要通过Binder进程间通信机制和匿名共享内存机制来实现的.关于数据共享的另一个 话 ...
- Android应用程序组件Content Provider在应用程序之间共享数据的原理分析(1)
在Android系统中,不同的应用程序是不能直接读写对方的数据文件的,如果它们想共享数据的话,只能通过Content Provider组件来实现.那么,Content Provide ...
- Android应用程序组件Content Provider的共享数据更新通知机制分析(3)
3. 数据更新通知的发送过程 在前面这篇文章Android应用程序组件Content Provider应用实例介绍的应用程序Acticle中,当调用ArticlesAda ...
- Android系统默认Home应用程序(Launcher)的启动过程源代码分析
在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应 ...
- Android系统默认Home应用程序(Launcher)的启动过程源代码分析(3)
Step 13. ActivityStack.startActivityLocked 这个函数定义在frameworks/base/services/java/com/android/server/ ...
- Android应用程序组件Content Provider简要介绍和学习计划
在Android系统中,Content Provider作为应用程序四大组件之一,它起到在应用程序之间共享数据的作用,同时,它还是标准的数据访问接口.前面的一系列文章已经分析过Android应用程序的 ...
- Android应用程序组件Content Provider在应用程序之间共享数据的原理分析(2)
Step 7. ContentProviderProxy.query 这个函数定义在frameworks/base/core/java/android/content/Conten ...
- Android系统默认Home应用程序(Launcher)的启动过程源代码分析(2)
Step 10. ActivityManagerService.systemReady 这个函数是在上面的Step 6中的ServerThread.run函数在将系统中的一系列服务都初始化完毕之后才 ...
最新文章
- 文件查找命令find的使用
- 主题模型简介(Topic Models)
- python解密md5值_Python之POST提交解密MD5
- linux局域网内根据ip查询主机名
- UI5 Source code map机制的细节介绍
- 多看 android6,多看阅读本地版
- 剑指offer——二进制中1的个数(c++)
- c语言 谭浩强 一维数组内放10个学生成绩 全局变量写一个函数 最高分、最低分、平均分...
- TP框架控制器的空操作
- 【死磕 Spring】—– IOC 之 bean 的初始化
- log4j 配置文件路径问题
- PKPM200608/CARD-1 8.0/TPM5000/神机妙算(黄狗)/桥梁通7.09/福莱一点通8.3/纬地5.82
- 编码通信与魔术初步(六)——经典魔术《傅氏幻术》赏析和《我的心灵感应》...
- Cherno C++ P61 C++的命名空间
- 《CISCO交换机常用命令》——【思科交换机配置及维护技能】
- ActiveX 暴漏你所有信息的可怕的插件!
- 数据可视化----常用图表样式
- 微信小程序参数传递获取当前页面的url和参数
- ubuntu执行uci出现 uci: error while loading shared libraries: lib
- R pdf大小_免费、开源、多平台支持的PDF文档处理软件 PDFsam Basic
热门文章
- html随机播放不同的音乐,如何随机播不同的背景音乐
- linux遍历文件夹下所有文件大小,Linux系统遍历文件夹 获取文件大小的操作(C语言实现)...
- Paddle 环境中 使用LeNet在MNIST数据集实现图像分类
- 几款高频环形磁芯的性能对比
- 新学期伊始,同学们就开始为十六届智能车竞赛出谋划策了
- Several ports (8005, 8080, 8009) required by Tomcat v5.5 Server at localhost are already in use.....
- python accept解析_python中requests库使用方法详解
- 东莞厚街工业机器人展会_工业机器人四大家族齐聚!东莞将在12月举办智博会...
- php指针注意问题,c语言指针注意问题
- Java高级技术笔记