模塊化解耦框架RxFluxArchitecture5-Application多模塊共存

相關係列文章git

模塊化解耦框架RxFluxArchitecture1-框架簡介github

模塊化解耦框架RxFluxArchitecture2-基本功能實現bash

模塊化解耦框架RxFluxArchitecture3-訂閱管理綁定生命週期app

模塊化解耦框架RxFluxArchitecture4-依賴庫與依賴注入框架

模塊化解耦框架RxFluxArchitecture5-Application多模塊共存ide

引言

組件化的一個目的是爲了業務解耦,業務模塊有些特殊功能的初始化須要在Application中完成,而殼模塊不須要知道具體如何完成這些初始化操做。這就須要解決多個業務模塊中Application共存的問題。網上不少方案是使用反射或者在AndroidManifest中配置meta-data來實現。這裏經過註解編譯時生成代碼和反射實現,簡單方便,易於理解。模塊化

框架圖

框架圖.jpg

方案實現

一、初始化

殼模塊和業務模塊中都須要以下配置:組件化

dependencies {
    //框架內核包括註解和接口,能夠單獨提取出來使用
    implementation 'com.github.coolfire2015.RxFluxArchitecture:core-arch:+'
    //註解編譯器
    annotationProcessor 'com.github.coolfire2015.RxFluxArchitecture:core-arch-processor:+'
}
複製代碼

二、業務模塊

建立 Application 代理類,實現RxAppLifecycle接口,並使用@RxAppDelegate標註。post

@RxAppDelegate
public class GanAppLifecyle implements RxAppLifecycle {
    @Override
    public void onCreate(Application application) {
        EventBus.builder()
                .addIndex(new GanEventBusIndex())
                .eventInheritance(false);
    }
}
複製代碼

三、殼模塊

SimpleApplication繼承RxApp類,並使用@RxAppBody標註。項目中惟一存在。ui

@RxAppBody
public class SimpleApplication extends RxApp {
    
}
複製代碼

方案原理

該方案採用GlideLibraryGlideModule的實現方式。

一、業務模塊中生成索引類

業務模塊中,@RxAppDelegate標註的RxAppLifecycle接口實現類,編譯後會在業務模塊路徑/build/generated/source/apt/debug/com/huyingbao/core/processor/下會生成一個索引類RxIndexer_

@RxIndex(
    modules = "com.huyingbao.module.wan.action.WanAppLifecyle"
)
public class RxIndexer_com_huyingbao_module_wan_action_WanAppLifecyle {
}
複製代碼

二、殼模塊生成全局代理類

在編譯過程當中,編譯處理器RxArchProcessor檢查代碼中是否惟一有使用@RxAppBody標註並繼承RxApp的類。

private void processRxAppBody(RoundEnvironment env) {
    for (TypeElement element : mProcessorUtil.getElementsFor(RxAppBody.class, env)) {
        if (mProcessorUtil.isRxApp(element)) {
            mRxAppList.add(element);
        }
    }
    mProcessorUtil.debugLog("got app modules: " + mRxAppList);
    if (mRxAppList.size() > 1) {
        throw new IllegalStateException("You cannot have more than one RxApp, found: " + mRxAppList);
    }
}
複製代碼

若是有,則從當前包/com/huyingbao/core/processor/附加的類中獲取到全部業務模塊中編譯生成的RxIndexer_類,再從RxIndexer_類的註解@RxIndex中取出 modules 字段中存儲的RxAppLifecycle接口實現類名。

private Set<String> getIndexedClassNames(PackageElement packageElement) {
    Set<String> rxAppLifecycles = new HashSet<>();
    //獲取當前包元素附加的全部元素
    List<? extends Element> rxAppLifecycleGeneratedElements = packageElement.getEnclosedElements();
    for (Element indexer : rxAppLifecycleGeneratedElements) {
        RxIndex annotation = indexer.getAnnotation(RxIndex.class);
        if (annotation != null) {
            Collections.addAll(rxAppLifecycles, annotation.modules());
        }
    }
    mProcessorUtil.debugLog("Found RxAppLifecycle: " + rxAppLifecycles);
    return rxAppLifecycles;
}
複製代碼

而後,在殼模塊路徑/build/generated/source/apt/debug/com/huyingbao/core/arch/下會生成一個RxAppLifecycle實現類RxAppLifecycleImpl(全局 Application 生命週期週期代理類)。

final class RxAppLifecycleImpl implements RxAppLifecycle {
  @Override
  public void onCreate(Application application) {
    new GanAppLifecycle().onCreate(application);
    new WanAppLifecyle().onCreate(application);
  }
}
複製代碼

三、殼模塊使用反射並調用方法

RxApp類中經過反射獲取RxAppLifecycleImpl實例對象。

private RxAppLifecycle getAnnotationGeneratedRxAppLifecycleImpl() {
    RxAppLifecycle result = null;
    try {
        Class<RxAppLifecycle> clazz = (Class<RxAppLifecycle>)
                    Class.forName("com.huyingbao.core.arch.RxAppLifecycleImpl");
        result = clazz.getDeclaredConstructor().newInstance();
    } catch (ClassNotFoundException e) {
        if (Log.isLoggable(TAG, Log.WARN)) {
            Log.w(TAG, "Failed to find RxAppLifecycleImpl. You should include an"
                        + " annotationProcessor compile dependency on com.github.coolfire2015.RxFluxArchitecture:core-arch-processor"
                        + " in your application and a @RxAppDelegate annotated RxAppLifecycle implementation"
                        + " and a @RxAppBody annotated RxApp implementation");
        }
    } catch (InstantiationException e) {
        throwIncorrectRxAppLifecycle(e);
    } catch (IllegalAccessException e) {
        throwIncorrectRxAppLifecycle(e);
    } catch (NoSuchMethodException e) {
        throwIncorrectRxAppLifecycle(e);
    } catch (InvocationTargetException e) {
        throwIncorrectRxAppLifecycle(e);
    }
    return result;
}
複製代碼

RxApp生命週期方法中調用RxAppLifecycleImpl實例對象中的對應方法。

private RxAppLifecycle mGlobalRxAppLifecycle;

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    mGlobalRxAppLifecycle = getAnnotationGeneratedRxAppLifecycleImpl();
}

@Override
public void onCreate() {
    super.onCreate();
    if (mGlobalRxAppLifecycle != null) {
       mGlobalRxAppLifecycle.onCreate(this);
    }
}
複製代碼

源碼

開源模塊化解耦框架RxFluxArchitecture,歡迎你們點贊Fork,更歡迎點評指導。

相關文章
相關標籤/搜索