目录
一、组件化要解决的问题
跨组件跳转页面,跨组件调取服务。
一、组件化实现思路
1.简单粗暴的做法
在公共组件里定义一个Map,用于注册所有组件的页面的class信息。
这种做法的关键是,组件何时注册?
方案1:利用Jetpack里的Initializer类
Initializer在清单配置好后,会自动在组件加载时执行,在Initializer的onCreate方法进行当前组件所有路由页面的注册。
/**
* create at 2020/11/25 14:45
* desc:路由基类
*/
public abstract class BaseRouteInitializer implements Initializer {
/**
* 保证只执行一次
*/
private static boolean initialized = false;
@NonNull
@Override
public Object create(@NonNull Context context) {
if(initialized == false){
initOnce(context);
}
onInit(context);
registerRepository();
registerPage();
return null;
}
private void initOnce(Context context) {
ToastUtils.init(context);
MMKV.initialize(context);
initialized = true;
}
/**
* 组件初始化
* @param context
*/
protected abstract void onInit(@NonNull Context context);
/**
* 注册仓库
*/
protected abstract void registerRepository();
/**
* 注册页面
*/
protected abstract void registerPage();
@NonNull
@Override
public List<Class<? extends Initializer<?>>> dependencies() {
return Collections.emptyList();
}
}
/**
* create at 2020/11/10 10:15
* desc:用于注册路由的Class
*/
public class MyRouteInitializer extends BaseRouteInitializer {
@Override
protected void onInit(@NonNull Context context) {
}
@Override
protected void registerRepository() {
}
@Override
protected void registerPage() {
LyRouter.getInstance().registerPage(LyRouter.PageDestinationKey.FRAGMENT_MY_FLEET, MyFleetFragment.class);
LyRouter.getInstance().registerPage(LyRouter.PageDestinationKey.FRAGMENT_CAR_DETAIL, CarDetailFragment.class);
LyRouter.getInstance().registerPage(LyRouter.PageDestinationKey.FRAGMENT_TRAFFIC_VIOLATIONS_INQUIRY, TrafficViolationsInquiryFragment.class);
LyRouter.getInstance().registerPage(LyRouter.PageDestinationKey.FRAGMENT_ANNUAL_INSPECTION_MANAGE, AnnualInspectionManageFragment.class);
LyRouter.getInstance().registerPage(LyRouter.PageDestinationKey.FRAGMENT_INSURANCE_MANAGE, InsuranceManageFragment.class);
LyRouter.getInstance().registerPage(LyRouter.PageDestinationKey.FRAGMENT_MAINTENANCE_MANAGE, MaintenanceManageFragment.class);
LyRouter.getInstance().registerPage(LyRouter.PageDestinationKey.FRAGMENT_REPAIR_MANAGE, RepairManageFragment.class);
LyRouter.getInstance().registerPage(LyRouter.PageDestinationKey.FRAGMENT_CAR_MONITOR, CarMonitorFragment.class);
}
}
方案2:利用静态广播
这种方式,我还没有验证,应该也是可行的。
对于动态广播,需要写代码,还是要找“勾子”。所以采用静态广播。
在app的Application执行的发一个广播,各个组件收到广播,即可进行注册。
2.标准做法
标准的做法是通过apt、poet等技术实现。
参见:
apt:http://122.152.205.50/wordpress_it/?p=2862
动态创建类的工具
poet:http://122.152.205.50/wordpress_it/?p=2924
Javassist:https://ljd1996.github.io/2020/04/23/Javassist%E7%94%A8%E6%B3%95/
组件化方案:https://www.jianshu.com/p/eefe62a0509d
组件化方案通用设计图:
一般模板类都会继承某个类或者实现某个接口,方便路由API库去反射调用模板类的方法。
0 条评论