组件化多Module的Application解决方案

问题

在组件化时,使用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目录中,否则会在构建阶段被移除,这样才能保证注入成功。

参考

完整demo

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容