一、组件化要解决的问题

跨组件跳转页面,跨组件调取服务。

一、组件化实现思路

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

组件化方案通用设计图:

img

一般模板类都会继承某个类或者实现某个接口,方便路由API库去反射调用模板类的方法。

分类: 组件化

0 条评论

发表回复

您的电子邮箱地址不会被公开。