组件化多 Application 共存

组件化开发将不同的业务逻辑进行解耦,每个业务模块拥有不同的功能,有些组件的功能需要在Application 中进行初始化,比如百度地图,百度 OCR。如果是模块共有的功能我们可以放到BaseApplication中,如果是一个模块自己专有的功能那就需要放到自己的Application中去。开始我们可能理所当然的任务这没有任何的问题,但是所有自定义的Application都需要在 AndroidManifest.xml中声明,但是 APK 只能包含一个Application,如果有多个Application同时在AndroidManifest.xml中进行声明就会产生冲突。如果解决这个问题举例说明:

1、首先看一下工程目录

通过下面的图片可以看到我建立了三个 model ,公共组件 common 用户组件usercenter 百度 ocr_ui 其中用户组件usercenter需要使用百度 ocr 功能。这样就需要在用户组件中去初始化 ocr。

Application 共存问题

2、具体实现方法,在基础组件 common 中建立 Application 的函数接口,然后在各个组件中去实现接口

多 application 共存

多 application 共存

建立 Application 生命周期的函数接口

  1. public interface ApplicationImpl {
  2. void onCreate(BaseApplication application);
  3. }

记录各组件的 ApplicationImpl 实现类路径,然后通过反射去实现

  1. public class ModelConfig {
  2. public static final String[] MODULESLIST = {
  3. "com.smb.usercenter.base.UserApplication"
  4. };
  5. }

建立基础 Application

  1. public class BaseApplication extends Application{
  2. @Override
  3. public void onCreate() {
  4. super.onCreate();
  5. modulesApplicationInit();
  6. }
  7. //通过反射方法找到对应的类,并调用接口
  8. private void modulesApplicationInit(){
  9. for (String moduleImpl : ModelConfig.MODULESLIST){
  10. try {
  11. Class<?> clazz = Class.forName(moduleImpl);
  12. Object object = clazz.newInstance();
  13. if (object instanceof ApplicationImpl){
  14. ((ApplicationImpl)object).onCreate(this);
  15. }
  16. } catch (ClassNotFoundException e) {
  17. e.printStackTrace();
  18. } catch (IllegalAccessException e) {
  19. e.printStackTrace();
  20. } catch (InstantiationException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }
  25. }

在各业务组件的 Application 中去实现生命周期的接口,在 onCreate 中去初始化

  1. public class UserApplication implements ApplicationImpl {
  2. @Override
  3. public void onCreate(BaseApplication application) {
  4. context = BaseApplication.getContext();
  5. initOcr();
  6. }
  7. /**
  8. * 百度 OCR 初始化方法
  9. */
  10. private void initOcr() {
  11. ...
  12. }
  13. }
3、将 BaseApplication 注册到 AndroidManifest.xml 中
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest ...>
  3. <application
  4. android:name="com.mtf.common.app.BaseApplication">
  5. ...
  6. </application>
  7. </manifest>

(完)