组件化多 Application 共存
组件化开发将不同的业务逻辑进行解耦,每个业务模块拥有不同的功能,有些组件的功能需要在Application
中进行初始化,比如百度地图,百度 OCR。如果是模块共有的功能我们可以放到BaseApplication
中,如果是一个模块自己专有的功能那就需要放到自己的Application
中去。开始我们可能理所当然的任务这没有任何的问题,但是所有自定义的Application
都需要在 AndroidManifest.xml
中声明,但是 APK 只能包含一个Application
,如果有多个Application
同时在AndroidManifest.xml
中进行声明就会产生冲突。如果解决这个问题举例说明:
1、首先看一下工程目录
通过下面的图片可以看到我建立了三个 model ,公共组件 common
用户组件usercenter
百度 ocr_ui
其中用户组件usercenter
需要使用百度 ocr 功能。这样就需要在用户组件中去初始化 ocr。
2、具体实现方法,在基础组件 common 中建立 Application 的函数接口,然后在各个组件中去实现接口
建立 Application 生命周期的函数接口
public interface ApplicationImpl {
void onCreate(BaseApplication application);
}
记录各组件的 ApplicationImpl 实现类路径,然后通过反射去实现
public class ModelConfig {
public static final String[] MODULESLIST = {
"com.smb.usercenter.base.UserApplication"
};
}
建立基础 Application
public class BaseApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
modulesApplicationInit();
}
//通过反射方法找到对应的类,并调用接口
private void modulesApplicationInit(){
for (String moduleImpl : ModelConfig.MODULESLIST){
try {
Class<?> clazz = Class.forName(moduleImpl);
Object object = clazz.newInstance();
if (object instanceof ApplicationImpl){
((ApplicationImpl)object).onCreate(this);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
}
在各业务组件的 Application 中去实现生命周期的接口,在 onCreate 中去初始化
public class UserApplication implements ApplicationImpl {
@Override
public void onCreate(BaseApplication application) {
context = BaseApplication.getContext();
initOcr();
}
/**
* 百度 OCR 初始化方法
*/
private void initOcr() {
...
}
}
3、将 BaseApplication 注册到 AndroidManifest.xml 中
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<application
android:name="com.mtf.common.app.BaseApplication">
...
</application>
</manifest>
(完)