ARouter是阿里巴巴开源出来的一款android路由框架,github地址为 : https://github.com/alibaba/ARouter

至于ARouter的诸多好处我就不介绍了,这里主要讲解在项目组件化下,ARouter的一些简单使用
先贴上工程目录:
工程一共分为4个模块,基础组件app、基础服务(包涵路由服务)basecommonlibrary模块、业务模块libraryone、业务模块librarytwo;
在4个模块的gradle文件当中加入如下代码:
android {
...
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName: project.getName()]
}
}
}
}
dependencies {
...
compile 'com.alibaba:arouter-api:1.2.1'
annotationProcessor 'com.alibaba:arouter-compiler:1.1.2'
}
依赖包的具体版本可自行选择。
接下来就是具体讲解ARouter如何在这几个模块中充当路由的角色了。
首先是app模块中定义的一个页面,布局很简单,就不贴代码了,效果如下;
Activity 部分代码如下:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt1:
RouterCommonUtil.startMainTextActivity(this, "测试文本");
break;
case R.id.bt2:
RouterCommonUtil.startMainImageActivity(this, "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1492584424522&di=5dcde77431914e0b944b8af9ff5f9277&imgtype=jpg&src=http%3A%2F%2Fimg3.imgtn.bdimg.com%2Fit%2Fu%3D1489971249%2C1618541505%26fm%3D214%26gp%3D0.jpg");
break;
case R.id.bt3:
RouterCommonUtil.startLibraryOneActivity(this);
break;
case R.id.bt4:
RouterCommonUtil.startLibraryTwoActivity(this);
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 1002) {
Toast.makeText(this, data.getStringExtra("arg2"), Toast.LENGTH_SHORT).show();
}
}
点击事件分别响应到本module(app)中的两个activity以及libraryone和librarytwo中的activity,其中第一个用来测试ForResult方式启动的Acitivty。
接下来是libraryone中Activity布局截图:
activity部分代码如下:
@Override
public void onClick(View v) {
int i = v.getId();
if (i == R.id.bt1) {
RouterCommonUtil.startMainActivity(this);
} else if (i == R.id.bt2) {
RouterCommonUtil.startLibraryTwoActivity(this);
}
}
也是测试了两个跳转,分别跳转到主Module中的Activity中和libraryTwo的Activity中,libraryTwo中的布局和代码跟libraryone中大同小异,这里就不继续贴出了,本项目会在附件中提供源码,欢迎下载。这里还需要贴出封装在basecommonlibrary模块中的公共跳转类,所有的module,都是通过该模块中的路由公共类来实现跳转的,完整代码如下:
import android.app.Activity;
import android.text.TextUtils;
import android.widget.Toast;
import com.alibaba.android.arouter.facade.Postcard;
import com.alibaba.android.arouter.launcher.ARouter;
import com.example.basecommonlibrary.router.IInterceptor.InterruptCallback;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
/**
* @author: xiewenliang
* @Filename:
* @Description:
* @date: 2017/4/25 15:06
*/
public class RouterCommonUtil {
private static void toastInterruptInfo(final Activity activity, final Postcard postcard) {
if (postcard.getTag() != null && postcard.getTag() instanceof String) {
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext((String) postcard.getTag());
}
}).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<String>() {
@Override
public void call(String s) {
if (!TextUtils.isEmpty(s) && activity != null) {
Toast.makeText(activity, (String) postcard.getTag(), Toast.LENGTH_SHORT).show();
}
}
});
}
}
public static void startMainActivity(final Activity activity) {
ARouter.getInstance().build("/ui/主页").navigation(activity, new InterruptCallback() {
@Override
public void onInterrupt(Postcard postcard) {
toastInterruptInfo(activity, postcard);
}
});
}
public static void startMainTextActivity(final Activity activity, String value) {
ARouter.getInstance().build("/ui/text", "文本").withString("arg1", value).navigation(activity, 1001, new InterruptCallback() {
@Override
public void onInterrupt(Postcard postcard) {
toastInterruptInfo(activity, postcard);
}
});
}
public static void startMainImageActivity(final Activity activity, String value) {
ARouter.getInstance().build("/ui/image", "图片").withString("arg1", value).navigation(activity, new InterruptCallback() {
@Override
public void onInterrupt(Postcard postcard) {
toastInterruptInfo(activity, postcard);
}
});
}
public static void startLibraryOneActivity(final Activity activity) {
ARouter.getInstance().build("/libraryOne/主页").navigation(activity, new InterruptCallback() {
@Override
public void onInterrupt(Postcard postcard) {
toastInterruptInfo(activity, postcard);
}
});
}
public static void startLibraryTwoActivity(final Activity activity) {
ARouter.getInstance().build("/libraryTwo/主页").navigation(activity, new InterruptCallback() {
@Override
public void onInterrupt(Postcard postcard) {
toastInterruptInfo(activity, postcard);
}
});
}
}
该类中主要提供了几个类的跳转方法,以及跳转失败后的信息打印方法,接下来就是测试跳转是否能够正常执行了,请大家自行构建代码或者下载本demo源码查看执行效果。
接下来讲解拦截器,以libraryone中的activity为例
@Route(path = "/libraryOne/主页", extras = CommonStation.CHECK_LOADING)
我们在activity上添加如上注解,其中extras的值可以作为判断的类型,具体看拦截器代码
import android.content.Context;
import com.alibaba.android.arouter.facade.Postcard;
import com.alibaba.android.arouter.facade.annotation.Interceptor;
import com.alibaba.android.arouter.facade.callback.InterceptorCallback;
import com.alibaba.android.arouter.facade.template.IInterceptor;
import com.example.basecommonlibrary.CommonStation;
/**
* @author: xiewenliang
* @Filename:
* @Description:
* @date: 2017/4/25 15:37
*/
@Interceptor(priority = 1, name = "拦截未登录")
public class TestOneIInterceptor implements IInterceptor {
@Override
public void process(Postcard postcard, InterceptorCallback callback) {
if (postcard.getExtra() == CommonStation.CHECK_LOADING && !CommonStation.checkLoading()) {
callback.onInterrupt(new RuntimeException("账号未登录"));
} else {
callback.onContinue(postcard);
}
}
@Override
public void init(Context context) {
}
}
在拦截器中,可以根据extra属性判断是否是需要拦截的类型,如果需要拦截,则执行callback的onInterrupt方法,并注明拦截原因,可以在路由跳转中提取拦截原因信息并打印。
当然ARouter中其它功能就不再一一介绍了,大家可以自行研究,附源码下载地址:ARouterDemo_jb51.rar
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# android组件化
# ARouter
相关文章:
如何访问已购建站主机并解决登录问题?
建站之星后台管理:高效配置与模板优化提升用户体验
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
如何通过宝塔面板实现本地网站访问?
如何快速搭建高效香港服务器网站?
制作网站怎么制作,*游戏网站怎么搭建?
如何快速使用云服务器搭建个人网站?
建站之星后台密码遗忘?如何快速找回?
Thinkphp 中 distinct 的用法解析
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
如何彻底删除建站之星生成的Banner?
建站之星如何实现五合一智能建站与营销推广?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
建站主机如何选?高性价比方案全解析
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
网站制作模板下载什么软件,ppt模板免费下载网站?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
建站与域名管理如何高效结合?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
网站制作公司,橙子建站是合法的吗?
西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
如何用PHP快速搭建高效网站?分步指南
深圳网站制作的公司有哪些,dido官方网站?
如何设置并定期更换建站之星安全管理员密码?
建站之星下载版如何获取与安装?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
如何在七牛云存储上搭建网站并设置自定义域名?
红河网站制作公司,红河事业单位身份证如何上传?
建站主机功能解析:服务器选择与快速搭建指南
如何选择最佳自助建站系统?快速指南解析优劣
成都响应式网站开发,dw怎么把手机适应页面变成网页?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
建站主机选择指南:服务器配置与SEO优化实战技巧
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
佛山网站制作系统,佛山企业变更地址网上办理步骤?
建站OpenVZ教程与优化策略:配置指南与性能提升
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
如何通过WDCP绑定主域名及创建子域名站点?
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
网页设计与网站制作内容,怎样注册网站?
如何快速生成ASP一键建站模板并优化安全性?
如何通过云梦建站系统实现SEO快速优化?
制作门户网站的参考文献在哪,小说网站怎么建立?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
如何在宝塔面板中修改默认建站目录?
*请认真填写需求信息,我们会在24小时内与您取得联系。