ARouter基本使用详情

配置:

build.grade中配置:

android {...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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

使用:

初始化:

一般在Application.onCreate()的初始化:

if(isDebug()) {// 这两行必须写在init之前,否则这些配置在init过程中将无效ARouter.openLog();// 打印日志ARouter.openDebug();// 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)}ARouter.init(mApplication);// 尽可能早,推荐在Application中初始化

1

2

3

4

5

6

添加注解:

对于你需要路由到的Activity,需要使用Route注解,对于Route注解,必须初始化path路劲,而且path必须至少存在两级以上,即像这样 /xx/xx ….,例子如下:

@Route(path ="/simple/simple1Activity")publicclassSimple1ActivityextendsAppCompatActivity{}

1

2

3

路由该Activity时,使用一下方法:

ARouter.getInstance().build("/simple/simple1Activity").navigation();

1

最基本的路由方案已经好了,现在编译就可以使用了。没错,就是这么简单。

路由传递参数:

上面简单的路由已经完成了,如果需要需要想目标Activity传递参数呢?可以看下面的例子,先看路由命令:

ARouter.getInstance().build("/simple/simpledata").withString("name","zhangsan").withInt("age",18).withParcelable("test",newTestParcelable("Tom",12)).navigation();

1

2

3

4

5

6

那么目标Activity呢?源码如下:

@Route(path ="/simple/simpledata")publicclassSimpleDataActivityextendsAppCompatActivity{TextView tv ;@Autowired()    String name ;@Autowired(name ="age")intage ;@AutowiredTestParcelable test ;@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);        setContentView(R.layout.activity_simple_data);//injectARouter.getInstance().inject(this);        tv = (TextView) findViewById(R.id.id_tv);        tv.setText("name:"+ name +",age:"+ age  +",test:"+test);    }}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

我们需要为参数声明字段,并用@Autowired注解表示,@Autowired可以填写name标识,依次来映射URL中的不同参数;最后使用ARouter.getInstance().inject(this);方法来inject来初始化@Autowired注解的字段。结果就就不贴了,这个比较简单。

startActivityForResult方案:

很多时候我们路由到目标Activity,然后需要返回Result,即我们通常重写的startActivityForResult&onActivityResult方法。使用ARouter也很简单,如下:

ARouter.getInstance().build("/simple/simpledata").                withString("name","zhangsan").                withInt("age",18).                withParcelable("test",newTestParcelable("Tom",12)).                navigation(this,100);

1

2

3

4

5

只需要在navigation()方法中添加参数了,第一个参数必须是Activity,第二个参数就是我们的requestCode。

获取路由结果:

当我们每一次进行路由时,可能需要知道我们的路由是否被接受,是否丢失,是否被拦截器拦截,那么可以使用navigation()方法的重载函数:

ARouter.getInstance().build("/test/simple_interceptor").navigation(this,newNavCallback() {@OverridepublicvoidonArrival(Postcard postcard) {//路由到达之后调用Log.d("MainActivity","onArrival : "+ postcard.getPath());            }@OverridepublicvoidonInterrupt(Postcard postcard) {//路由被拦截时调用Log.d("MainActivity","onInterrupt : "+ postcard.getPath());            }@OverridepublicvoidonLost(Postcard postcard) {//路由被丢失时调用Log.d("MainActivity","onLost : "+ postcard.getPath());            }@OverridepublicvoidonFound(Postcard postcard) {//路由目标被发现时调用Log.d("MainActivity","onLost : "+ postcard.getPath());            }        });

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

interceptor拦截器:

ARouter也添加了拦截器模式,拦截器有很多用处,比如路由到目标页面时,检查用户是否登录,检查用户权限是否满足,如果不满足,则路由到相应的登录界面或者相应的路由界面。ARouter的拦截器比较奇葩,只需要实现IInterceptor接口,并使用@Interceptor注解即可,并不需要注册就能使用。当然这也有了它的坏处,就是每一次路由之后,都会经过拦截器进行拦截,显然这样程序的运行效率就会降低。Interceptor可以定义多个,比如定义登录检查拦截器,权限检查拦截器等等,拦截器的优先级使用priority定义,优先级越大,越先执行。拦截器内部使用callback.onContiune()/callback.onInterrupt(),前者表示拦截器任务完成,继续路由;后者表示终止路由。例子:

@Interceptor(priority =4)publicclassTestInterceptorimplementsIInterceptor{@Overridepublicvoidprocess(finalPostcard postcard,finalInterceptorCallback callback) {        Log.d("interceptor",postcard.getPath() +".."+ postcard.getGroup());//这里进行逻辑处理  //callback.onContinue(postcard);or//callback.onInterrupt(postcard)}@Overridepublicvoidinit(Context context) {        Log.d("init",TestInterceptor.class.getSimpleName() +" has been inited");    }}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

而这里的逻辑判断,比如我要判断用户是否登录,如果登录了,则放行,否则进行登录路由。

if(Constant.isLogin()) {    callback.onContinue(postcard);}else {    callback.onInterrupt(null);ARouter.getInstance().build("/router/login").navigation();}

1

2

3

4

5

6

当然了,如果有些路由希望不经过任何的拦截器,ARouter很贴心的给出了一个绿色通道函数供我们使用,使用greenChannel()时所有的Interceptor将失效:

ARouter.getInstance().build("/test/simple_interceptor").greenChannel().navigation();

1

自定义全局降级策略:

这个说的比较高大上,通俗一点讲,就是如果我们的app全是Native写的,如果有一天我们的隐性的Intent不能匹配所有的Activity时,我们的Activity就会报错,更坏的结果就是会导致崩溃。而降级策略就是为了解决这个问题的,如果不存在这个路由,那么我们可以集中处理这些错误,比如返回到主页面,或者也可以返回一个错误页面。降级策略需要实现DegradeService接口,并且使用@Route注解来表明那些哪些路由需要被处理。降级策略可以有多个。举个例子:

@Route(path ="/user/*")publicclassLoginDegradeServiceImplimplementsDegradeService{Context mContext;@OverridepublicvoidonLost(Context context, Postcard postcard) {//LogUtils.d("onLost:"+ postcard);        ARouter.getInstance().build("/router/login").navigation();    }@Overridepublicvoidinit(Context context) {this.mContext = context ;    }}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

这个是定义登录时,如果使用了错误的路由方式,将路由到登录界面。注意到path=”/user/*”,表明只要是一次级的user的错误路由,都会传递到这里。因为项目会存在很多模块,这里定义的”/user/” 只是识别用户模块的,而影响其他模块。

服务管理:

个人感觉这个功能比较鸡肋,项目中目前没有用到过,但是ARouter还是提供了相应的方法,这里还是简单介绍一下。这里的服务不是Android四大组件的所说的那种Service,更贴切的说,应该是一种接口,通过ARouter依赖注入找到其实现类,然后使用接口中的方法。 

服务接口需要继承IProvider:

publicinterfaceHelloServiceextendsIProvider{voidsayHello(String name);    }

1

2

3

获取实现类,并@Route绑定path:

@Route(path ="/service/helloservice")publicclassHelloServiceImplimplementsHelloService{Context mContext;@OverridepublicvoidsayHello(String name) {        Toast.makeText(mContext,"hello "+ name, Toast.LENGTH_SHORT).show();    }@Overridepublicvoidinit(Context context) {this.mContext = context ;        Log.d("HelloServiceImpl","the context is "+ mContext);    }}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

那么在使用时,可以有两种方法,一种是通过Name获取,一种是通过Type获取: 

通过Name获取:

((HelloService)ARouter.getInstance().build("/service/helloservice").navigation()).sayHello("micro name ");

1

而通过Type获取时:

ARouter.getInstance().navigation(HelloService.class).sayHello("micro type ");

1

通过上述两种方案,都可以调用HelloService接口,并执行sayHello方法。个人感觉并没什么卵用,我需要这种实现方案到底要干什么呢? 个人现在的项目还用不上这种方式吧。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • ARouter源码解读 以前看优秀的开源项目,看到了页面路由框架ARouter,心想页面路由是个啥东东,于是乎网上...
    陆元伟阅读 506评论 0 1
  • ARouter探究(一) 前言 ARouter 是 Alibaba 开源的一款 Android 页面路由框架,特别...
    Jason骑蜗牛看世界阅读 1,315评论 1 3
  • 开发一款App,总会遇到各种各样的需求和业务,这时候选择一个简单好用的轮子,就可以事半功倍 前言 上面一段代码,在...
    WangDeFa阅读 65,687评论 44 199
  • Arouter框架适合项目比较大,模块多的时候,可以实现解耦,不需要知道跳转的是哪个activity,只需要知道配...
    破晓11阅读 3,457评论 0 2
  • 那天下班后,我到家打开门,老婆正在厨房洗什么东西,我径直走到客厅摊坐在沙发上。 “今天上午楼下出了件事,你知道吗?...
    没什么大不了的阅读 549评论 0 1