赞
踩
伪代码如下:
- ActivityThread
- private void handleBindApplication(AppBindData data) {
- ...
- //1.获取到Application
- app = data.info.makeApplication(data.restrictedBackupMode, null);
- ...
- //2.初始化ContentProvider
- installContentProviders(app, data.providers);
- ...
- //3.调用Application的onCreate
- mInstrumentation.callApplicationOnCreate(app);
- ...
- }
由此可知:APP启动的整体顺序是获取Application->初始化ContentProvider->调用Application#onCreate。也就是说ContentProvider的初始化是要在Application之前的。其中ContentProvider的初始化就是循环便利储存ContentProvider的集合调用它的onCreate方法。
因此,很多第三方组件的初始化放到了ContentProvider中,例如leakcanary2的初始化、firebase初始化、WorkManager初始化等。
使用ContentProvider初始化优缺点
优点:
低侵入接入,不需要手动添加初始化代码,降低接入成本。
降低耦合度,抽离代码方便。
缺点:
多个SDK使用ContentProvider初始化,无法保证不同SDK初始化循序。
最好注意多个ContentProvider初始化的时长,加载完毕才会执行Application#onCreate的调用。
注意暴露风险,声明provider的时候,配置exported为false。
App Startup 提供了一个 ContentProvider 来运行所有依赖项的初始化,避免每个第三方库单独使用 ContentProvider 进行初始化,从而提高了应用的程序的启动速度。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。