美文网首页安卓中级进阶Android 理论组件化
组件化多Module的Application解决方案

组件化多Module的Application解决方案

作者: 麻油里 | 来源:发表于2019-05-08 16:15 被阅读159次

    问题

    在组件化时,使用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

    相关文章

      网友评论

        本文标题:组件化多Module的Application解决方案

        本文链接:https://www.haomeiwen.com/subject/zqhvoqtx.html