相關係列文章git
模塊化解耦框架RxFluxArchitecture1-框架簡介github
模塊化解耦框架RxFluxArchitecture2-基本功能實現bash
模塊化解耦框架RxFluxArchitecture3-訂閱管理綁定生命週期app
模塊化解耦框架RxFluxArchitecture4-依賴庫與依賴注入框架
模塊化解耦框架RxFluxArchitecture5-Application多模塊共存ide
組件化的一個目的是爲了業務解耦,業務模塊有些特殊功能的初始化須要在Application
中完成,而殼模塊不須要知道具體如何完成這些初始化操做。這就須要解決多個業務模塊中Application
共存的問題。網上不少方案是使用反射或者在AndroidManifest
中配置meta-data
來實現。這裏經過註解編譯時生成代碼和反射實現,簡單方便,易於理解。模塊化
殼模塊和業務模塊中都須要以下配置:組件化
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 {
}
複製代碼
該方案採用Glide中LibraryGlideModule
的實現方式。
業務模塊中,@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,更歡迎點評指導。