上一篇 ARouter与组件化实现之ARouter页面跳转原理 讲了ARouter的页面跳转原理
这篇记录下ARouter是如何让两个互不依赖的组件调用对方的接口的。
通过上一篇中提到的两个map,groupMap和pathMap,我们知道所有被ARouter注解的类都会在编译期间被保存起来,并且他们的class是对所有组件可见的。那么这样一来就很清晰了,既然所有组件都能拿到对方组件的class,那么自然也可以获取到他们的对象,如此一来,要调用对方的接口非常容易。
所以我们需要做的就是暴露接口,接口下沉到common组件,继承自ARouter提供的统一接口,如Call,HomeWeather表示这是home模块提供出来的一个获取天气的接口
public interface HomeWeather extends Call{
String getCityWeather(String city);
}
然后在home模块实现接口方法,并被ARouter注解
@ARouter(path = "/home/HomeWeatherApi")
public class HomeWeatherApi implements HomeWeather{
public String getCityWeather(String city){
return "home模块请求到天气数据了。。。";
}
}
这样一来,编译之后,其他模块可以拿到HomeWeatherApi的class文件,从而可以创建出这个对象,然后强转成HomeWeather,就可以自由的调用getCityWeather接口了
HomeWeather homeRequest = (HomeWeather) RouterManager.getInstance().build("/home/HomeWeatherApi").navigation(this);
String weatherInfo = homeRequest.getCityWeather("上海");
System.out.println(weatherInfo);
实现原理和跳转activity是一样的,虽然类型不同,但都是通过保存对应组件内的class对象,反射创建实例来实现的。
public class ARouter$$Path$$news implements ARouterPath {
@Override
public Map<String, RouterBean> getPathMap() {
Map<String,RouterBean> pathMap = new HashMap();
pathMap.put("/news/NewsDrawableImpl2", RouterBean.create(RouterBean.TypeEnum.CALL, NewsDrawableImpl2.class, "/news/NewsDrawableImpl2", "news"));
pathMap.put("/news/NewsDrawableImpl", RouterBean.create(RouterBean.TypeEnum.CALL, NewsDrawableImpl.class, "/news/NewsDrawableImpl", "news"));
pathMap.put("/news/MainActivity", RouterBean.create(RouterBean.TypeEnum.ACTIVITY, MainActivity.class, "/news/MainActivity", "news"));
return pathMap;
}
}