一、什么是路由。
ARouter是阿里巴巴开源的Android平台的对页面跳转、服务提供路由功能的中间件,使用起来比较简单。
二、原生路由的问题。
1、原生路由intent,有两种实现形式,显式与隐式。显式的情况下,与类之间存在依赖关系,耦合性比较高。
2、隐式方式一般在清单文件中进行配置,扩展性比较差。
3、原生路由页面跳转无法控制,一旦使用了StartActivity()就无法插手其中任何环节,只能交给系统管理,这就导致了在跳转失败的情况下无法降级,而是会直接抛出运营级的异常
三、路由框架的特点。
1、分发:分发是路由框架最基本的功能,也就是简单的跳转。
2、将组件和页面按照一定的规则管理。
3、路由的过程中可以对路由进行定制性扩展。
四、路由的优点
1、支持直接解析标准URL进行跳转,并自动注入参数到目标页面中
2、支持多模块工程使用
3、支持添加多个拦截器,自定义拦截顺序
4、支持依赖注入,可以单独作为依赖注入框架使用
5、支持MultiDex(Google 方案)
6、映射关系按组分类、多级管理、按需初始化
7、灵活的降级策略,支持用户全局降级与局部降级
8、支持多种多种方式配置转场动画
9、支持获取fragment
10、完全支持Kotlin以及混编
11、页面、拦截器、服务均自动注册到框架
五、接入说明
1、添加依赖和配置
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName : project.getName() ]
}
}
}
}
dependencies {
// 替换成最新版本, 需要注意的是api
// 要与compiler匹配使用,均使用最新版可以保证兼容
compile'com.alibaba:arouter-api:x.x.x'
annotationProcessor'com.alibaba:arouter-compiler:x.x.x'
...
}
2、添加代码混淆
-keep publicclass com.alibaba.android.arouter.routes.**{*;}
-keep class *implements com.alibaba.android.arouter.facade.template.ISyringe{*;}
//打印日志
ARouter.openLog()
//开启调试模式、线上必须关闭
ARouter.openDebug()
//尽可能早在Application中
ARouter.init(this)
六、使用说明
1、添加注解
@Route(path ="/test1/Activity1")
public class Activity1 extend Activity {
...
}
2、应用内简单跳转
ARouter.getInstance().build(/test/activity).navigation();
3、带参数的跳转
ARouter.getInstance().build(/test/activity).withString("name","皑皑")
.withInt("year",10).withObject("object",new Object()).navigation();
参数类型:
withBoolean(String key,Boolean value)
withChar(String key,char value)
withShort(String key,short value)
withInt(String key,int value)
withLong(String key,long value)
.......
//跳转动画
.withTransition(int enterAnim,int exitAnim)
4、带导航回调跳转
ARouter.getInstance().build("/test/activity").navigation(this,new NavCallback(){
@Override
public void onArrival(Postcard postcard)
{
}
@Override
public void onInterrupt(Postcard postcard)
{
}
});
5、自定义分组
@Route(path ="/test1/Activity",group=“custom”)
public class Activity extend Activity {
...
}
ARouter.getInstance().build("/test1/Activity1", "custom").navigation();
6、Fragment路由
@Route(path = "/com/OneFragment")
public class OneFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_one, container, false);
return view ;
}
}
//获取fragment的实例
Fragment fragment = (Fragment) ARouter.getInstance().build( "/com/OneFragment" ).navigation();
7、暴露服务
自定义接口
public interface IService extends IProvider {
void sayHello(Context context );
}
先定义一个 IService 的实现类 MyService 并且添加注解
@Route(path = "/service/hello", name = "测试服务")
public class MyService implements IService {
@Override
public void sayHello( Context context ) {
Toast.makeText( context , "hello", Toast.LENGTH_SHORT).show(); }
@Override
public void init(Context context) { }}
发现服务,先定义服务对象,添加注解
@Autowired(name = "/service/hello")
IService service;
添加注解初始化,自动赋值
ARouter.getInstance().inject(this);
调用service中sayHello()方法
service.sayHello(this);
8、关闭路由
Arouter.getInstance().destory();