Application 初始化流程
创始人
2025-06-01 20:56:20
0

Application 的 onCreate 和 attachBaseContext

Application 的 onCreate 和 attachBaseContext 是 Application 的两个回调方法,通常我们会在其中做一些初始化操作。

onCreate 和 attachBaseContext 顺序: Application 的 attachBaseContext 在 onCreate 之前执行。

handleBindApplication

App 的 application 创建是在 ActivityThread 的 handleBindApplication 方法完成的。

  private void handleBindApplication(AppBindData data) {....final InstrumentationInfo ii;....if (ii != null) {//1.创建ContentImplfinal ContextImpl instrContext = ContextImpl.createAppContext(this, pi);try {final ClassLoader cl = instrContext.getClassLoader();mInstrumentation = (Instrumentation)cl.loadClass(data.instrumentationName.getClassName()).newInstance();} catch (Exception e) {throw new RuntimeException("Unable to instantiate instrumentation "+ data.instrumentationName + ": " + e.toString(), e);}//2.创建Instrumentationfinal ComponentName component = new ComponentName(ii.packageName, ii.name);mInstrumentation.init(this, instrContext, appContext, component,data.instrumentationWatcher, data.instrumentationUiAutomationConnection);....//3.创建Application对象Application app;app = data.info.makeApplication(data.restrictedBackupMode, null);// Propagate autofill compat stateapp.setAutofillCompatibilityEnabled(data.autofillCompatibilityEnabled);mInitialApplication = app;...//4.启动当前进程中的ContentProvider和调用其onCreate方法if (!data.restrictedBackupMode) {if (!ArrayUtils.isEmpty(data.providers)) {installContentProviders(app, data.providers);// For process that contains content providers, we want to// ensure that the JIT is enabled "at some point".mH.sendEmptyMessageDelayed(H.ENABLE_JIT, 10*1000);}}//5.调用Application的onCreate方法try {mInstrumentation.callApplicationOnCreate(app);} catch (Exception e) {if (!mInstrumentation.onException(app, e)) {throw new RuntimeException("Unable to create application " + app.getClass().getName()+ ": " + e.toString(), e);}}}}

可以看到初始化顺序: 1.创建ContentImpl -> 2.创建Instrumentation -> 3.创建Application对象 并调用 attachBaseContext方法 -> 4.启动当前进程中的ContentProvider和调用其onCreate方法 -> 5.调用Application的onCreate方法

总结

Application 的 attachBaseContext 在 onCreate 之前执行。attachBaseContext 中拿到了创建的 ContextImpl,但是此时 Application 没有创建完成,比如 mLoadedApk 的赋值还没有执行。此时如果在 attachBaseContext 中调用 this.getApplicationContext,也会返回空,因为 application 还没有创建完成。等到回调了 onCreate 时,Application 才算真正构造完毕。

如果项目中的初始化都是同步初始化的话,并且使用到了多个ContentProvider,App Startup 还是不错的,毕竟统一到了一个ContentProvider中,同时支持了简单的顺序依赖。

但是如果在追求App性能与启动速度的场景中,多个SDK同时利用各自定义的ContentProvider实现“自启动”, 在各种有先后顺序与依赖的SDK初始化下做优化,那么 App Startup 就不是很好用了。也正式这个原因,目前不建议将 App Startup 用于生产环境中。

目前的推荐方案还是之前我们都使用过的:同步+异步初始化,并通过有向无环图拓扑排序的方式; Anchors

相关内容

热门资讯

寻人启事 寻人启事范文(通用8篇)  寻人启事,汉语词语,发布寻人启事寻人,是失踪者及其亲友间相互寻找的一种基...
“乌合之卒”的意思 “乌合之卒”的意思 成语拼音: [wū hé zhī zú] ...
入木三分成语解释 入木三分成语解释  入木三分,是汉语的一则成语,出自唐·张怀瓘《书断·王羲之》。下面是小编为大家整理...
“逾闲荡检”的意思 “逾闲荡检”的意思 成语拼音: [yú xián dàng jiǎn] ...
形容勇敢的词语 形容勇敢的词语大全  词语,是词和短语的合称,包括词(含单词、合成词)和词组(又称短语),组成语句文...
“磨拳擦掌”的意思 “磨拳擦掌”的意思 成语拼音: [mó quán cā zhǎng] ...
小学生元旦表演什么节目好   2016年元旦晚会目创意推荐:  1、成语连珠,就是先说个成语每个组或每个人用最后一个字接成语…...
岩的成语及解释 关于岩的成语及解释大全  以“岩”字开头的成语及解释如下:  [岩穴之士] 指隐士。古时隐士多山居,...
“胸无成算”的意思 “胸无成算”的意思 成语拼音: [xiōng wú chéng suàn] ...
“导德齐礼”的意思 “导德齐礼”的意思 成语拼音: [dǎo dé qí lǐ] ...
描写人物外貌的成语 有关描写人物外貌的成语  导语:描写人物外貌的成语有很多,你都知道哪些呢?下面是小编为你准备的有关描...
《公孙仪相鲁而嗜鱼》文言文阅... 《公孙仪相鲁而嗜鱼》文言文阅读答案  公孙仪相鲁而嗜鱼,一国尽争买鱼而献之。公孙仪不受。其弟子谏曰:...
“不可磨灭”的意思 “不可磨灭”的意思 成语拼音: [bù kě mó miè] ...
王尔德童话英文版 王尔德童话英文版(通用9篇)  王尔德是19世纪英国第一位文艺天才,他风流不羁的外表下有一颗纯洁的童...
三字经儿歌朗读全文 三字经儿歌朗读全文  《三字经》难免含有一些精神糟粕、艺术瑕疵,但其独特的思想价值和文化魅力仍然为世...
苏轼被贬黄州时写的诗有哪些? 苏轼被贬黄州时写的诗有哪些?  导语:小编整理了苏轼在被贬在黄州时写的诗词,有兴趣的朋友可以看看。 ...
余光中经典语录 关于余光中经典语录  余光中,当代著名作家、诗人、学者、翻译家,出生于南京,祖籍福建永春。因母亲原籍...
诗经木瓜全文注音版 诗经木瓜全文注音版  《诗经·木瓜》,是通过赠答表达深厚情意的诗作,出自《诗经·国风·卫风》,是先秦...
澄江化石群阅读及答案 澄江化石群阅读及答案  阅读说明文,完成6-9题。(12分,每题3分)  ①五亿三千万年前的一天,一...
杨子之邻人亡羊节选文言文阅读... 杨子之邻人亡羊节选文言文阅读及答案  阅读。  杨子之邻人亡羊①  《列子》  杨子②之邻人亡③羊,...