组件化多 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{@Overridepublic 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 {@Overridepublic void onCreate(BaseApplication application) {context = BaseApplication.getContext();initOcr();}/*** 百度 OCR 初始化方法*/private void initOcr() {...}}
3、将 BaseApplication 注册到 AndroidManifest.xml 中
<?xml version="1.0" encoding="utf-8"?><manifest ...><applicationandroid:name="com.mtf.common.app.BaseApplication">...</application></manifest>
(完)