Skip to content

插件化配置:隔离性插件

Haoge edited this page Aug 14, 2017 · 2 revisions

隔离型插件由于路由表数据无法共享。所以我们需要有个方式,来打破隔离。Router提供了一个远程服务进程。用于合并所有插件的路由表并提供给各插件使用。使插件可以获取其他宿主或插件的路由。

打破隔离。共享路由数据:

使用远程服务进程。需要的host宿主中添加包含有远程服务的依赖包:

compile "com.github.yjfnypeu.Router:router-host:${ROUTER_VERSION}"

对于插件。使用不含有远程服务的依赖包即可

compile "com.github.yjfnypeu.Router:router-api:${ROUTER_VERSION}"

然后在插件以及宿主的application初始化的时候。初始化启动远程服务。并将各自的路由规则注册到远程服务中:

/*
 * 参数:
 *   1. hostPackage:宿主的包名。用于启动宿主提供的router远程服务
 *   2. context: 用于进行启动远程服务时使用的context
 *   3. pluginName: 注册插件的唯一标识。可用RouterConfiguration#isRegister(pluginName)方法判断此插件名对应的插件是否已被加载。进而做插件未加载时路由找不到的适配。
 */
RouterConfiguration.get().startHostService(hostPackage, context, pluginName);
兼容插件化跳转方式:

插件化实现原理不同。各插件的界面跳转方式也千差万别。但无非是针对不同插件的启动。需要一些额外的数据并提供特定的api供使用。比如RePlugin/VirtualApk。在插件间跳转的时候。需要插件的包名或者别名。针对这种情况。Router提供了以下几个接口:

  1. IRemoteFactory:用于针对不同的插件。来定制提供不同的数据供别的插件进行使用:
RouterConfiguration.get().setRemoteFactory(remoteFactory);
  1. ActivityLauncher:路由页面跳转的启动器。可以根据插件的特有api定制各自的启动器,完美兼容使用。在此启动器中可以获取到其他插件对应路由所提供的额外数据。以供做对应的适配兼容工作。

  2. ActionLauncher: 动作路由的启动器。一般来说插件化并没有此功能。个人也建议在隔离型插件化中。避免使用动作路由。

路由启动器中可获取到其他插件通过上方的IRemoteFactory创建的额外数据。便于有针对性的做兼容适配

RouterConfiguration.get().setActivityLauncher(activityLauncher);
RouterConfiguration.get().setActionLauncher(actionLauncher);