返回顶部
首页 > 资讯 > 移动开发 >ContentProvider启动流程示例解析
  • 219
分享到

ContentProvider启动流程示例解析

ContentProvider启动流程ContentProvider启动 2023-03-02 20:03:06 219人浏览 八月长安
摘要

目录正文App启动installContentProviders正文 ContentProvider是内容提供者,可以跨进程提供数据。 大家都知道,ContentProvider的

正文

ContentProvider是内容提供者,可以跨进程提供数据。

大家都知道,ContentProvider的启动,是在Application的onCreate方法之前的,所以ContentProvider的初始化时间会影响整个App的启动速度。

ContentProvider启动流程具体是什么样的呢?让我们进入源码的世界来一探究竟。

App启动

App启动时,AMS会通过跨进程Binder调用,访问到ApplicationThread种的bindApplication方法。

      public final void bindApplication(String processName, ApplicationInfo appInfo,
                List<ProviderInfo> providers, ComponentName instrumentationName,
                ProfilerInfo profilerInfo, Bundle instrumentationArgs,
                IInstrumentationWatcher instrumentationWatcher,
                IUiAutomationConnection instrumentationUiConnection, int debugMode,
                boolean enableBinderTracking, boolean trackAllocation,
                boolean isRestrictedBackupMode, boolean persistent, Configuration config,
                CompatibilityInfo compatInfo, Map services, Bundle coreSettings,
                String buildSerial, boolean autofillCompatibilityEnabled) {
            // 拼接AppBindData,发送给ActivityThread的H
            sendMessage(H.BIND_APPLICATION, data);
        }

这个方法主要作用是,拼接AppBindData,发送给ActivityThread中的Handler mH。在这个Handler中,会处理Message,然后调用handleBindApplication(data)方法。

private void handleBindApplication(AppBindData data) {
    final InstrumentationInfo ii;
    // 创建 mInstrumentation 实例
    if (ii != null) {
        //创建ContextImpl
        final ContextImpl appContext = ContextImpl.createAppContext(this, pi);
        try {
            //创建mInstrumentation实例
            final ClassLoader cl = appContext.getClassLoader();
            mInstrumentation = (Instrumentation) cl.loadClass(data.instrumentationName.getClassName()).newInstance();
        } catch (Exception e) {}
    } else {
        mInstrumentation = new Instrumentation();
    }
    Application app;
    try {
        // 创建 Application 实例
        app = data.info.makeApplication(data.restrictedBackupMode, null);
        mInitialApplication = app;
        // 如果不是backup模式,则调用installContentProvider,启动ContentProvider
         if (!data.restrictedBackupMode) {
                if (!ArrayUtils.isEmpty(data.providers)) {
                    //启动ContentProvider
                    installContentProviders(app, data.providers);
                    mH.sendEmptyMessageDelayed(H.ENABLE_JIT, 10*1000);
                }
            }
        try {
            //调用Application的onCreate
            mInstrumentation.callApplicationOnCreate(app);
        } catch (Exception e) { }
    }
}

这个方法非常长,主要做的事情有以下四点:

  • 创建一个ContentImpl对象
  • 创建一个Instrument对象
  • 创建Application实例
  • 如果不是backup模式,调用installContentProviders,启动ContentProvider
  • 调用ApplicationonCreate方法

installContentProviders

private void installContentProviders(Context context, List<ProviderInfo> providers) {
        final ArrayList<ContentProviderHolder> results = new ArrayList<>();
        // 遍历所有的providers
        for (ProviderInfo cpi : providers) {
            // 开始启动ContentProvider
            ContentProviderHolder cph = installProvider(context, null, cpi,
                    false , true , true );
             results.add(cph);
        }
        // 将成功启动的provider存储到AMS的mProviderMap中
        ActivityManager.getService().publishContentProviders(getApplicationThread(), results);
    }

这个方法,循环遍历所有待启动的ContentProvider,调用installProvider启动。

 private ContentProviderHolder installProvider(Context context,
            ContentProviderHolder holder, ProviderInfo info,
            boolean noisy, boolean noReleaseNeeded, boolean stable) {
                // 反射创建ContentProvider
                final java.lang.ClassLoader cl = c.getClassLoader();
                LoadedApk packageInfo = peekPackageInfo(ai.packageName, true);
                localProvider = cl.loadClass(className).newInstance();
                provider = localProvider.getIContentProvider();
                // 调用ContentProvider的attachInfo方法
                localProvider.attachInfo(c, info);
    }

这个方法,通过反射创建ContentProvider,然后调用attachInfo方法。

 private void attachInfo(Context context, ProviderInfo info, boolean testing) {
        // 调用onCreate方法
       ContentProvider.this.onCreate();
}

ContentProviderattachInfo方法中,会调用onCreate方法,完成ContentProvider的启动。

以上就是ContentProvider启动流程示例解析的详细内容,更多关于ContentProvider启动流程的资料请关注编程网其它相关文章!

--结束END--

本文标题: ContentProvider启动流程示例解析

本文链接: https://lsjlt.com/news/198284.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ContentProvider启动流程示例解析
    目录正文App启动installContentProviders正文 ContentProvider是内容提供者,可以跨进程提供数据。 大家都知道,ContentProvider的...
    99+
    2023-03-02
    ContentProvider启动流程 ContentProvider启动
  • ContentProvider启动流程源码分析
    本文小编为大家详细介绍“ContentProvider启动流程源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“ContentProvider启动流程源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。C...
    99+
    2023-07-05
  • linux启动流程的示例分析
    这篇文章将为大家详细讲解有关linux启动流程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。linux启动流程简介我们都知道,由于linux的稳定性,通常被作为服务器系统,要想称为一个PHP的高...
    99+
    2023-06-09
  • Linux启动过程的示例分析
    这篇文章主要为大家展示了“Linux启动过程的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux启动过程的示例分析”这篇文章吧。Linux启动过程详细介绍启动第一步--加载BIOS...
    99+
    2023-06-09
  • React Native 启动流程详细解析
    导读:本文以 react-native-cli 创建的示例工程(安卓部分)为例,分析 React Native 的启动流程。 工程创建步骤可以参考官网。本文所分析 React Nat...
    99+
    2024-04-02
  • RocketMQ源码解析broker 启动流程
    目录1. 启动入口2. 创建BrokerController2.1 controller实例化2.2 初始化controller2.2.1 注册处理器:BrokerControlle...
    99+
    2023-03-23
    RocketMQ broker 启动 RocketMQ broker
  • HMaster启动流程简析
    很多细节不便在本篇写的过于详细,等后续细节分析0. 由HBaseCommandLine首先对HMaster进行初始化0.1 检查是否进行了IP绑定(https://issues.apache.org/jir...
    99+
    2024-04-02
  • Android 系统启动流分析 &amp; Zygote启动流程分析
    本文是基于Android 7.1进行分析       Zygote在Android系统扮演着不可或缺的角色,Android系统的启动首先需要Zygote参与,比如启动Syste...
    99+
    2022-06-06
    启动 系统 Android
  • Tomcat9请求处理流程与启动部署过程的示例分析
    这篇文章主要为大家展示了“Tomcat9请求处理流程与启动部署过程的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Tomcat9请求处理流程与启动部署过程的示例分析”这篇文章吧。Over...
    99+
    2023-06-02
  • Angularjs中启动过程的示例分析
    这篇文章主要介绍Angularjs中启动过程的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!启动过程(v1.3.9)步骤一用自执行函数的形式让整个代码在加载完成之后立即执行i...
    99+
    2024-04-02
  • 01-MyBatis启动流程分析
    目录 MyBatis简单介绍 启动流程分析 简单总结 附录 MyBatis内置别名转换 参考 ...
    99+
    2017-03-19
    01-MyBatis启动流程分析
  • Android Service启动流程刨析
    强调一下阅读系统源码,起码要对进程间通信要了解,对binder机制非常非常清楚,binder就是指南针,要不然你会晕头转向;强行阅读,就容易睡着。 Service启动先来一张图感受一...
    99+
    2022-11-13
    Android Service Android Service启动
  • Android Activity启动流程刨析
    目录前言一、Binder的基本理解二、Activity启动的双向IPC过程三、AMS服务注册前言 上篇文章写到 Service 的启动过程; 相对来说Activity的启动过程比Se...
    99+
    2022-11-13
    Android Activity启动 Android Activity
  • PowerManagerService之手动灭屏流程示例分析
    目录前言1. 灭屏流程2. 设备进入打盹状态2.1 更新用户行为2.2 更新显示屏的电源状态2.3 更新梦境状态3. 启动doze dream结束前言 PowerManagerSer...
    99+
    2022-11-13
    PowerManagerService 手动灭屏 PowerManagerService 灭屏
  • http访问解析流程的示例分析
    这篇文章给大家分享的是有关http访问解析流程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。http访问网址域名解析流程:1、在浏览器中输入www.qq.com域名,操...
    99+
    2024-04-02
  • 小程序启动app开发示例分析
    这篇文章主要介绍“小程序启动app开发示例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“小程序启动app开发示例分析”文章能帮助大家解决问题。  小程序跳转app使用说明  用户可以在小程序里更...
    99+
    2023-06-26
  • Eureka源码阅读解析Server服务端启动流程实例
    目录环境1.spring cloud整合eureka server demo1.1 新建spring boot项目pom.xml文件添加配置文件1.2 启动类1.3 启动2. spr...
    99+
    2022-11-13
    Eureka Server端启动流程 Eureka Server服务端
  • Linux中启动与自启动的示例分析
    这篇文章将为大家详细讲解有关Linux中启动与自启动的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Linux启动与自启动的实例详解一 启动与自启动服务启动:就是在当前系统中让服务运行,并提供功能...
    99+
    2023-06-09
  • Android okhttp的启动流程及源码解析
    目录前言 什么是OKhttp OkHttp是如何做网络请求的 1.它是如何使用的? 1.1 通过构造者模式添加 url,method,header,body 等完成一个请求的信息 R...
    99+
    2024-04-02
  • 【SpringBoot3.0源码】启动流程源码解析 • 上
    文章目录 初始化 SpringBoot启动类: @SpringBootApplicationpublic class AppRun { public static void main(String[] args...
    99+
    2023-08-23
    spring boot java spring
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作