ARouter提供了两个默认的IProvider
对象:拦截器和自动注入
一、 拦截器服务
1.声明
获取服务器拦截对象实例,是通过path
来查找的
// InterceptorServiceImpl.java文件
@Route(path = "/arouter/service/interceptor")
public class InterceptorServiceImpl implements InterceptorService {
}
2.查找
ARouter.init()
成功后会获取拦截器服务的对象实例
// ARouter.java文件
public static void init(Application application) {
if (!hasInit) {
logger = _ARouter.logger;
_ARouter.logger.info(Consts.TAG, "ARouter init start.");
hasInit = _ARouter.init(application);
if (hasInit) {
_ARouter.afterInit(); // 初始化完成后,实例化拦截器服务对象实例
}
_ARouter.logger.info(Consts.TAG, "ARouter init over.");
}
}
// _ARouter.java文件
static void afterInit() {
// Trigger interceptor init, use byName.
interceptorService = (InterceptorService) ARouter.getInstance().build("/arouter/service/interceptor").navigation();
}
3.创建和初始化
对象实例在创建成功后调用它的init
方法进行了初始化
// LogisticsCenter.java文件
public synchronized static void completion(Postcard postcard) {
if (null == postcard) {
throw new NoRouteFoundException(TAG + "No postcard!");
}
RouteMeta routeMeta = Warehouse.routes.get(postcard.getPath());
// ... 各种判断
switch (routeMeta.getType()) {
case PROVIDER: // if the route is provider, should find its instance
// Its provider, so it must implement IProvider
Class<? extends IProvider> providerMeta = (Class<? extends IProvider>) routeMeta.getDestination();
IProvider instance = Warehouse.providers.get(providerMeta);
// 返回的对象是单例的
if (null == instance) { // There's no instance of this provider
IProvider provider;
try {
provider = providerMeta.getConstructor().newInstance();
provider.init(mContext); // 第一次创建的时候调用init方法进行了初始化
Warehouse.providers.put(providerMeta, provider);
instance = provider;
} catch (Exception e) {
throw new HandlerException("Init provider failed! " + e.getMessage());
}
}
postcard.setProvider(instance);
postcard.greenChannel(); // Provider should skip all of interceptors
break;
case FRAGMENT:
postcard.greenChannel(); // Fragment needn't interceptors
default:
break;
}
}
二、自动注入服务
1.声明
// AutowiredServiceImpl.java 文件
@Route(path = "/arouter/service/autowired")
public class AutowiredServiceImpl implements AutowiredService {
}
2.使用
用户调用ARouter.getInstance().inject(this)
方法,会触发该服务的查找、创建和初始化
// _ARouter.java文件
static void inject(Object thiz) {
AutowiredService autowiredService = ((AutowiredService) ARouter.getInstance()
.build("/arouter/service/autowired")
.navigation());
if (null != autowiredService) {
autowiredService.autowire(thiz);
}
}
此时,autowiredService
会调用apt
生成的xxxxx$$ARouter$$Autowired
类的inject
方法完成自动注入
这个注入过程是递归遍历父类的,所以只需要在最外层调用
ARouter.getInstance().inject(this)
方法,不能再base类中添加ARouter.getInstance().inject(this)方法,否则会触发两次注入过程
三、其它的服务功能
- PathReplaceService.java 通过path查找前,提供替换路径的服务
- PretreatmentService.java 在navigation前,做些事情
- SerializationService 自动注入时提供序列化服务,例如JSON序列化参赛对象,注入时再反序列化
网友评论