Skip to content

1、组件数据交互

mqzhangw edited this page Mar 26, 2018 · 1 revision

组件之间的数据传输(交互)是通过接口+实现的方式来完成的,组件之间完全面向接口编程

组件声明提供的服务(接口)

为了增加可读性,所有组件的服务都统一定义在componentservice这个module中 例如reader组件需要向外提供服务,在componentservice增加readerbook文件夹,定义ReadBookService

public interface ReadBookService {

    Fragment getReadBookFragment();
}

组件提供具体实现类

服务的具体实现在组件中完成,由于代码的完全隔离,实现类对于其他组件是完全不可见的

public class ReadBookServiceImpl implements ReadBookService {
    @Override
    public Fragment getReadBookFragment() {
        return new ReaderFragment();
    }
}

将实现类注册到Router中

实现类的注册时机在每个组件的ApplicationLike中,ApplicationLike相当于每个组件的Application类,控制组件的生命周期。

在组件加载的时候进行注册,同时在组件卸载的时候进行反注册

public class ReaderAppLike implements IApplicationLike {
    Router router = Router.getInstance();
    @Override
    public void onCreate() {
        router.addService(ReadBookService.class.getSimpleName(), new ReadBookServiceImpl());
    }

    @Override
    public void onStop() {
        router.removeService(ReadBookService.class.getSimpleName());
    }
}

其他组件调用服务

由于代码隔离,其他组件只能对ReadBookService可见,所以只能针对这个接口进行编程。

通过Router获取服务的具体实现,使用前需要判空。

Router router = Router.getInstance();
if (router.getService(ReadBookService.class.getSimpleName()) != null) {
    ReadBookService service = (ReadBookService) router.getService(ReadBookService.class.getSimpleName());
    fragment = service.getReadBookFragment();
    t = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.tab_content, fragment).commitAllowingStateLoss();
}

这样就做到了接口和实现的分离,组件之间完全针对接口编程。