一个App里面默认都有一个单例那就是Application,而组件化的过程中除了app这个壳工程的启动是我们时长需要设置一些默认的参数配置等操作,其实对于附加启动的module也是需要一些附加的启动或者对自身所在module做处理。那么我们怎么来实现module的Application随App一起启动做初始化操作呢?
我们分析一下通常会遇到的情况
我们组件化中会有多个独立Module,那么需要随App进行同时进行配置的可能会有多个,那么在我们是不需要一个统一的模版规范让读个module走循序呢?
根据上面我们可以做如下拆分 1 做一个抽象的基类继承于Application,内部做成模版流程,App以及Module的Application均继承于此
public abstract class BaseApp extends Application { /** * Application 初始化 */ public abstract void initModuleApp(Application application);
/** * 所有 Application 初始化后的自定义操作 */ public abstract void initModuleData(Application application); public void afterModuleAndBeforeData(Application application) {
}
@Override public void onCreate() { super.onCreate(); this.initModuleApp(this); this.afterModuleAndBeforeData(this); this.initModuleData(this); }}
//登陆modulepublic class LoginApp extends BaseApp { @Override public void initModuleApp(Application application) {
}
@Override public void initModuleData(Application application) {
}
@Override public void afterModuleAndBeforeData(Application application) { super.afterModuleAndBeforeData(application); ServiceFactory.getInstance().setAccountService(new AccountService()); }}
2 壳工程中的Application
对于壳工程此时需要的就是实现整个App启动前的初始化以及对应加载Module启动
2.1 自身配置的启动
public class MainApp extends BaseApp { @Override public void onCreate() { // 初始化 ARouter if (BuildConfig.DEBUG) { // 这两行必须写在init之前,否则这些配置在init过程中将无效 ARouter.openLog(); // 打印日志 ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险) } ARouter.init(this); super.onCreate(); }
@Override public void initModuleApp(Application application) { }
@Override public void initModuleData(Application application) {
}
@Override public void afterModuleAndBeforeData(Application application) { super.afterModuleAndBeforeData(application);
}}
2.2 需要初始化配置的Module动态加载
对于需要启动的module我们可以通过在壳工程中声明Module中Application的包名采用反射的方式来实现同时将壳工程的Application传递值Moudle
// for (String moduleApp : Components.moduleApps) { try { Class clazz = Class.forName(moduleApp); BaseApp baseApp = (BaseApp) clazz.newInstance(); baseApp.initModuleApp(this); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } }
至此我们完成了App的启动,一个按照模版的方式完成多个Module的动态初始化加载