问题
在组件化时,使用Application存在一些问题:
- 组件单独运行时如何在Application中初始化一些必要的库。
- 项目整体运行时,如何初始化组件特有的库。
解决思路
1.在Base库中定义BaseApplication,实现IApplication接口,在BaseApplication的onCreate中进行通用的初始化。
2.Module中的Application继承BaseApplication,并且实现专属初始化的方法。
3.整体运行时,使用CC-Register将每个Module的Application注入到ApplicationManager中,在壳app的Application初始化时调用ApplicationManager的初始化方法进行初始化。
具体实现
IApplication接口
public interface IApplication {
/**
* 当前Module的Application是否是调试模式
* @return
*/
boolean isDebug();
/**
* Module单独使用到的初始化在这里进行
*/
void init();
}
BaseApplication
public abstract class BaseApplication extends Application implements IApplication {
@Override
public void onCreate() {
super.onCreate();
//每个module都要用到的初始化在这里
Stetho.initializeWithDefaults(this);
CC.enableDebug(isDebug());
CC.enableVerboseLog(isDebug());
CC.enableRemoteCC(isDebug());
init();
}
}
管理类ApplicationManager
public class ApplicationManager {
private static List<IApplication> applicationList = new ArrayList<>();
private static void register(IApplication iApplication) {
if (iApplication != null) {
applicationList.add(iApplication);
}
}
public static void init() {
for (IApplication application : applicationList) {
application.init();
}
}
}
某个Module的Application
public class DebugApplication extends BaseApplication {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public boolean isDebug() {
return BuildConfig.DEBUG;
}
@Override
public void init() {
Log.d("xx","module b application init");
}
}
壳App的Application
public class MyApplication extends BaseApplication {
@Override
public void onCreate() {
super.onCreate();
CC.init(this);
ApplicationManager.init();
}
@Override
public boolean isDebug() {
return BuildConfig.DEBUG;
}
@Override
public void init() {
}
}
cc-register注入代码
ccregister.registerInfo.add([
'scanInterface' : 'com.qianfanyun.module_base.base.application.IApplication'
, 'codeInsertToClassName' : 'com.qianfanyun.module_base.base.application.ApplicationManager'
, 'registerMethodName' : 'register'
, 'scanSuperClasses':['com.qianfanyun.module_base.base.application.BaseApplication']
])
注意
- Module的Application不要再放到debug目录中,否则会在构建阶段被移除,这样才能保证注入成功。
网友评论