美文网首页
ARouter 提供的服务2020-12-05

ARouter 提供的服务2020-12-05

作者: orgcheng | 来源:发表于2020-12-05 15:15 被阅读0次

    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)方法,否则会触发两次注入过程

    三、其它的服务功能

    1. PathReplaceService.java 通过path查找前,提供替换路径的服务
    2. PretreatmentService.java 在navigation前,做些事情
    3. SerializationService 自动注入时提供序列化服务,例如JSON序列化参赛对象,注入时再反序列化

    相关文章

      网友评论

          本文标题:ARouter 提供的服务2020-12-05

          本文链接:https://www.haomeiwen.com/subject/lnsgwktx.html