参考文献:java
superxlcr的ARouter学习笔记android
码字农民工的文章git
繁华落尽666的文章程序员
本文主要介绍的知识点
- 关于android路由框架解决的问题
- android路由框架的使用(这里只是介绍ARouter的使用)
- 关于使用ARouter框架的注意事项
- 总结
相信你们在工做中都会遇到这样的问题,经过其余App或者经过网页跳转到指定的本身的App或者跳转到指定的页面中去,通常都是在推送中或者经过Banner点击以后的操做,通常的操做都是像下面这样的github
<intent-filter>
<action android:name="com.hejin.arouter.Main2Activity"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
复制代码
Intent intent = new Intent();
intent.setAction("com.hejin.arouter.Main2Activity");
startActivity(intent);
复制代码
其实这里我要说明一下,若是你是正规的开发公司我以为通常都不会这么去写,其实这个跳转彻底能实现,可是通常正规的公司都会定一些协议和端口号,也就是说会添加scheme来指定一些数据的协议部分和path进行匹配,可是随着时间的推移和团队的扩大,会慢慢的暴露出不少问题:编程
尤为是在项目演进的时候都会进行组件化开发,因此这里网上有不少大神就研究出路由框架这么一个东西,解决了上面的相应问题,这里接触的就是阿里巴巴开源的ARouter在GitHub上已经已经有3.+k的start了,相对来讲应该比较稳定,因此让咱们开始吧!api
defaultConfig {
.......
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
}
复制代码
dependencies {
compile 'com.alibaba:arouter-api:x.x.x'
annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
...
}
复制代码
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //路由须要
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
复制代码
这句话必定要加上不然根本就跳转不过去,具体为何我还真是不知道.... 有了以上的内容就完成了基本的配置,就能够进行相应的跳转了...安全
/*初始化路由框架*/
ARouter.init(this);
复制代码
@Route(path = "XXX/XXX")
复制代码
这里面要注意两点首先这个注解里面的内容必须是二级菜单,这个在github上面有解释,其次就是这个注解要写在Activity的类上边bash
ARouter.getInstance().build("/XXX/XXX").navigation();
//跳转中携带参数
ARouter.getInstance().build("/XXX/XXX")
.withLong("key", "value")
.withString("key", "value")
.navigation
复制代码
这里面的参数要和你要跳转的Activity注解中的参数保持一致,当你传递参数的时候,你直接经过Intent去取就能够了.app
Uri uri = Uri.parse("/test/activity");
ARouter.getInstance()
.build(uri)
.navigation();
复制代码
当你传递参数的时候你能够经过Intent取获取,固然也能够经过相应的注解进行获取,就像下面这样:
@Autowired(name = "xxx")
public String text;
复制代码
这里呢要注意,修饰符必须是public而且key值要相互对应.还要在目标的Activtiy中添加**ARouter.getInstance().inject(this);**才可使用相应的值,不然取值的时候会失败,可是不会报空指针.
有没有想过,以前在Activity跳转的时候可使用overridePendingTransition();,可是如今经过路由跳转的话,没有地方取设置动画了,而后ARouter为咱们想到了这个问题.
ARouter.getInstance().build(path).withTransition(R.anim_slide_in,R.anim_slide_out);
复制代码
ActivityOptionsCompat compat = ActivityOptionsCompat.makeScaleUpAnimation(view, view.getWidth() / 2, view.getHeight() / 2, 0, 0);
ARouter.getInstance().build("path").withOptionsCompat(compat).navigation();
复制代码
ARouter可让咱们处理跳转过程的结果,什么用呢?就是你找到目标以后要进行什么操做.
ARouter.getInstance().build("/module/jumpTestActivity2").navigation(null,new NavigationCallback() {
@Override
public void onFound(Postcard postcard) {
// 找到目标后进行的操做
}
@Override
public void onLost(Postcard postcard) {
// 找不到目标进行的操做
}
});
复制代码
补充说明: 在最新api中已是四个方法了!
ARouter.getInstance().build("/test/activity").navigation(this, new NavigationCallback() {
@Override
public void onFound(Postcard postcard) {
//找到队应的内容的时候
Log.e("done", "onFound: ");
}
@Override
public void onLost(Postcard postcard) {
//没有找到对应的内容的时候
Log.e("done", "onLost: ");
}
@Override
public void onArrival(Postcard postcard) {
//跳转成功
Log.e("done", "onArrival: ");
}
@Override
public void onInterrupt(Postcard postcard) {
//拦截操做
Log.e("done", "onInterrupt: ");
}
});
复制代码
这里能够在onLost中去处理"位置页面"的跳转结果,好比升级APP之类的话术.
ARouter.getInstance().build("/test/activity").navigation(this,10);
复制代码
后面那个参数就是请求码,别的和以前的都同样.
在ARouter中有个组的概念,什么意思呢?就是在构建路由请求的时候,能够指定分组. 其实这个分组原本就是有个你像path=/test/activity test就至关是分组,可是也可使用group进行分组,像下面这段代码:
@Route(path = "/test/activity", group = "app")
复制代码
这里须要强调一下,若是你设置了相应的分组,那么在进行跳转的时候,必定要使用ARouter.getInstance().build(path, group)进行跳转,不然没法找到相应的跳转
能够从新定向你的URL地址
@Route(path = "/test/activity2")
public class PathReplaceServerImp implements PathReplaceService {
@Override
public String forString(String path) {
path = "/test/activity2";
return path;
}
@Override
public Uri forUri(Uri uri) {
return null;
}
@Override
public void init(Context context) {
Log.e("done", "init: 这里是初始化的时候执行的方法");
}
}
复制代码
这里说明一下:上面得path必定要加上一个任意项目中出现得注解便可,若是项目中没有出现得话会报空指针异常的.经过上面的代码,就能够更改项目中跳转时候的path和URL地址了.
ARouter的拦截器能够在navigation的过程当中拦截请求,并进行一系列的处理 ,是一种AOP的编程模式(应用场景为检查登录状态等)要实现拦截器,首先咱们须要实现IInterceptor接口,并使用Interceptor注解标记咱们的拦截器,并传入priority优先级参数(数字越小,优先级越高),其实拦截器就是实现了一个接口去进行回调的!
public class TestInterceotor implements IInterceptor {
@Override
public void process(Postcard postcard, final InterceptorCallback callback) {
if (postcard.getPath().equals("/test/activity")) {
callback.onContinue(postcard);
} else {
callback.onContinue(postcard);
}
}
@Override
public void init(Context context) {
Log.e("done", "init: 初始化调用");
}
}
复制代码
这里说明几点内容:
上面的内容只是简单的用到了拦截器,可是理解起来毕竟又一些晦涩,当直接说让你实现登录的拦截,你怎么实现,开始的时候我也以为简单,可是当本身写的时候,我发现这个问题真不是看上去那么简单.这里我先把内容拦截器的代码都放上,而后我在讲解!
ARouter.getInstance().build("/test/activity").navigation(this, new NavCallback() {
@Override
public void onArrival(Postcard postcard) {
}
@Override
public void onInterrupt(Postcard postcard) {
Log.e(TAG, "onInterrupt: 这个方法是拦截器执行以后才执行的");
}
});
复制代码
@Interceptor(priority = 7)
public class TestInterceotor implements IInterceptor {
@Override
public void process(Postcard postcard, final InterceptorCallback callback) {
if (postcard.getPath().equals("/test/activity")) {
Log.e("done", "process: main2Activity");
if (APP.isLogin) {/*已经登录*/
callback.onContinue(postcard);
} else {/*没有登录*/
ARouter.getInstance().build("/test/activity2")
.withString("name", postcard.getPath()).navigation();
}
Log.e("done", "process: 执行完了");
} else {
Log.e("done", "process: 这个方法何时执行");
callback.onContinue(postcard);
}
}
@Override
public void init(Context context) {
Log.e("done", "init: 初始化调用");
}
}
复制代码
@Route(path = "/test/activity2")
public class Main3Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
ARouter.getInstance().inject(this);
}
public void click(View view) {
APP.isLogin = true;
ARouter.getInstance().build("/test/activity").navigation();
finish();
}
}
复制代码
这里第一次跳转的时候,因为拦截器使得没有登录的逻辑就跳转到了登录页面,以后我在登录页面模拟了一次登录的操做,而后关闭这个页面以前,我又从新跳转了目标页面,此次因为已经登录了,因此会直接继续执行跳转了目标页面.这里说的挺简单的,有一个回调我尚未搞清楚,onInterrupt这个回调以后有什么用,其实这里也能够传入一个字段,而后跳转的时候直接传入这个字段,这个字段主要是保存要跳转的页面的数据,以后就能直接跳转了.这样就解决了耦合的问题.
@Route(path = "/test/activity", extras = 0;/*注意这里是int类型的参数*/)
复制代码
说明一下:这个是在目标的Activity页面添加的额外参数,以后会在拦截器内生效.
其实关于这个框架还有不少问题我没有理解,可是基本的一些内容都已经讲解了,其实接触这个框架主要是当初看见组件化开发的时候,看到了这个框架,其实在项目中使用也能够,总体管理了跳转.写的挺乱的,感谢你们抽出宝贵时间来阅读,有什么不对的地方但愿指正.