ARouter解析

https://github.com/alibaba/ARouter
阿里github arouter详细文档

1.路由框架的定义

即映射页面跳转关系的,也包含跳转相关的一切功能。

2.使用场景:

动态跳转:一般来说复杂的电商跳转多页面需要很强的灵活性,   
	    很多情况下是运营人员动态配置的下发活动页面,需要灵活的进行跳转

组件化:64K问题、协作开发问题等,app一般都会走向组件化。
	   组件化就是将APP按照一定的功能和业务拆分成多个组件module,不同的组件独立开发,
	   组件化不仅能够提供团队的工作效率,还能够提高应用性能。
	   而组件化的前提就是解耦,那么我们首先要做的就是解耦页面之间的依赖关系
	   
Native与H5的问题:需要非常便捷并且统一的跳转方案,因为在H5中是无法使用StartActivity()
      跳转到Native页面的,而从Native跳转到H5页面也只能通过配置浏览器的方式实现

现阶段的困境:

原生跳转方式的不足

显式跳转, Intent intent = new Intent(activity, XXActivity.class);
		由于需要直接持有对应class,从而导致了强依赖关系,提高了耦合度

隐式跳转,Intent intent = new Intent(); 
	   intent.setAction(“com.android.activity.MY_ACTION”);
	action等属性的定义在Manifest,导致了扩展性较差规则集中式管理,导致协作变得非常困难。
	
原生的路由方案会出现跳转过程无法控制的问题,因为一旦使用了StartActivity()就无法插手其中任何
环节了,只能交给系统管理,这就导致了在跳转失败的情况下无法降级,而是会直接抛出运行时的异常。

router的拦截器功能特别强大,可以插手跳转中问题哦。

3.api 使用

defaultconfig 中:

javaCompileOptions {
    annotationProcessorOptions {
        arguments = [ moduleName : project.getName() ]
    }
    }

dependencies中:
compile ‘com.alibaba:arouter-api:1.2.2’
annotationProcessor ‘com.alibaba:arouter-compiler:1.1.3’

 1.普通跳转 
ARouter.getInstance().build("/test/activity").navigation(); 
2.跳转并携带请求码 
ARouter.getInstance().build("/test/activity2").navigation(this, requestCode); 
3.URI跳转 
/*这种使用URi的方式中,URi的Scheme 和 host不影响结果,可以随便设,关键的是path 
* - build(URI)会把URI解析为path,并把当前URI存入PostCard 
* - build(String)构造的PostCard不存储URI*/ 
Uri testUriMix = Uri.parse("xx://xxx/test/activity2"); 
ARouter.getInstance().build(testUriMix) 
.withString("name", "老王") 
.withInt("age", 18) 
.withBoolean("boy", true) 
.withLong("high", 180) 
.withString("url", "https://a.b.c") 
.withParcelable("pac", testParcelable) 
.withObject("obj", testObj) 
.navigation(); 


配置自定义序列化方式
上面的代码中有withObject进行传参,没有定义序列化方式是无法进行解析因此需要定义一个序列化方式,以下采用FastJson进行序列化
// 如果需要传递自定义对象,需要实现 SerializationService,并使用@Route注解标注(方便用户自行选择序列化方式),例如: 

@Route(path = "/service/json") 
public class JsonServiceImpl implements SerializationService { 
@Override 
public void init(Context context) { 
} 
@Override 
public <T> T json2Object(String text, Class<T> clazz) { 
return JSON.parseObject(text, clazz); 
} 
@Override 
public String object2Json(Object instance) { 
return JSON.toJSONString(instance); 
} 
} 

postcard的解释:

构造路由信息的容器Postcard(英文是:明信片)
得到ARouter实例后调用build方法,传入目标页面的path("/test/activity"),这里使用的是代理
模式,其实是调用_ARouter的build方法,ARouter.init也是调用的_ARouter的init方法,
里面主要是做一些映射文件的加载工作。

public Postcard build(String path) {
        return _ARouter.getInstance().build(path);
}
_ARouter的build方法,路径不能为空,目标页面必须要有注解@Route(path = "/test/activity")。
然后会返回一个Postcard,官方解释A container that contains the roadmap.
这是个路由信息的存储器,里面包含页面跳转的所有信息。

登录拦截器的实现:

priority值越小,优先级越高,name多数情况可以省略

@Interceptor("priority= 8,name = \"登录拦截器\"")
public class LoginInterceptor implements IInterceptor {

    @Override
    public void process(Postcard postcard, InterceptorCallback interceptorCallback) {
    。。。。//各种五花八门的处理
    
	callback.onContinue(postcard); // 处理完成,交还控制权 
// callback.onInterrupt(new RuntimeException("我觉得有点异常")); // 觉得有问题,中断路由流程 
// 以上两种至少需要调用其中一种,否则不会继续路由 
    }

    @Override
    public void init(Context context) {
	// 拦截器的初始化,会在sdk初始化的时候调用该方法,仅会调用一次 

    }
}
// 需要在目标页面中配置一些属性,比方说"是否需要登陆"之类的
// 可以通过 Route 注解中的 extras 属性进行扩展,这个属性是一个 int值,
换句话说,单个int有4字节,也就是32位,可以配置32个开关
// 剩下的可以自行发挥,通过字节操作可以标识32个开关,通过开关标记目标页面的一些属性,
在拦截器中可以拿到这个标记进行业务逻辑判断
@Route(path = "/test/activity", extras = Consts.XXXX)

通过依赖注入解耦:服务管理(一) 暴露服务

// 声明接口,其他组件通过接口来调用服务 
public interface HelloService extends IProvider { 
String sayHello(String name); 
} 
// 实现接口 
@Route(path = "/service/hello", name = "测试服务") 
public class HelloServiceImpl implements HelloService { 
@Override 
public String sayHello(String name) { 
return "hello, " + name; 
} 
@Override 
public void init(Context context) { 
} 
} 

通过依赖注入解耦:服务管理(二) 发现服务

public class Test { 
@Autowired 
HelloService helloService; 
@Autowired(name = "/service/hello") 
HelloService helloService2; 
HelloService helloService3; 
HelloService helloService4; 
public Test() { 
ARouter.getInstance().inject(this); 
} 
public void testService() { 
// 1. (推荐)使用依赖注入的方式发现服务,通过注解标注字段,即可使用,无需主动获取 
// Autowired注解中标注name之后,将会使用byName的方式注入对应的字段,不设置name属性,会默认使用byType的方式发现服务(当同一接口有多个实现的时候,必须使用byName的方式发现服务) 
helloService.sayHello("Vergil"); 
helloService2.sayHello("Vergil"); 
// 2. 使用依赖查找的方式发现服务,主动去发现服务并使用,下面两种方式分别是byName和byType 
helloService3 = ARouter.getInstance().navigation(HelloService.class); 
helloService4 = (HelloService) ARouter.getInstance().build("/service/hello").navigation(); 
helloService3.sayHello("Vergil"); 
helloService4.sayHello("Vergil"); 
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zz白龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值