ARouter - Android路由框架

ARouter简介

ARouter是阿里巴巴开源的Android平台中对页面、服务提供路由功能的中间件,提倡的是简单。它干的活就是负责页面跳转的,看到这就有点纳闷,这Android不是有startActivity和startActivityForResult吗?
它的意义在哪呢?

ARouter的意义

  • 灵活性强
    在一些复杂的业务场景下,很多功能都是动态配置的,比如跳转到一个活动页面,我们事先并不知道具体的目标页面,但如果事先做好了约定,提前做好页面映射,便可以自由配置。
  • 解耦
    ARouter可以降低各个关联页面之间的耦合性,解耦页面之间的依赖关系。
  • 简化代码
    ARouter它是基于注解实现,使用方便,你之前的数行跳转代码可以精简成一行代码
  • 性能优良
    ARouter是在编译期处理注解的,对运行时性能没有影响
  • 支持注解Fragment
    ARouter不仅支持注解Activity,还支持注解Fragment

OK,好处意义讲到这里就可以了,赶紧把它引入到项目中吧


集成ARouter

  • 在项目级的build.gradle中加入依赖:
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        compile 'com.alibaba:arouter-api:1.3.1'  
        annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'  
    }
}

Api 的版本和 compiler 的版本号需要用最新的。最新的版本在 Github上可以找到。

GitHub查询最新版本
  • ARouter初始化
    Router需要初始化,用于初始化路由表,建议放到Application中做:
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        // 打印日志
        ARouter.openLog(); 
        // 开启调试模式(如果在InstantRun(就是AndroidStudio2.0以后新增的一个可以减少很多编译时间的运行机制)模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
        ARouter.openDebug(); 
        // 初始化尽可能早,推荐在Application中初始化
        ARouter.init(this); 
    }
}

OK,集成完毕,开始使用!

使用基本ARouter

  • ARouter注解路由
    我们新建一个TestARouterActivity作为测试 ,在 TestARouterActivity中添加注解的代码如下:
// 在支持路由的页面上添加注解(必须写)
// 这里的路径需要注意的是至少需要有两级,/xx/xx,名字你自己起
@Route(path = "/com/TestARouterActivity")
public class TestARouterActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
    }
}
  • 开始跳转
 //这里的"/com/TestARouterActivity"就是上面的TestARouterActivity添加的路由注解
 ARouter.getInstance().build("/com/TestARouterActivity").navigation();

OK,跳转完成了,简单吧,哈哈

再来看一下稍微复杂一点的跳转:startActivityForResult()

这个就改动一处即可,其他不用变:

navigation(Activity mContext, int requestCode)

把上面的TestARouterActivity用来实现就是:

ARouter.getInstance().build("/com/TestARouterActivity").navigation(this , 100);

这里补充一点哈,如果你的路径下的对不上号,就是你想跳转到的页面的ARouter注解路由和build(" ")里面的不同,那么ARouter就是Toast提示,崩溃是不存在的。

再来看一下稍微复杂一点的跳转:页面传值
ARouter里面提供了丰富大量的参数类型,供我们选择

//基础类型
.withString( String key, String value )
.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)
.withDouble( String key, double value)
.withByte( String key, byte value)
.withFloat( String key, float value)
.withCharSequence( String key,  CharSequence value)

//数组类型
.withParcelableArrayList( String key, ArrayList<? extends Parcelable > value)
.withStringArrayList( String key,  ArrayList<String> value)
.withIntegerArrayList( String key, ArrayList<Integer> value)
.withSparseParcelableArray( String key, SparseArray<? extends Parcelable> value)
.withCharSequenceArrayList( String key, ArrayList<CharSequence> value)
.withShortArray( String key,  short[] value)
.withCharArray( String key, char[] value)
.withFloatArray( String key, float[] value)
.withCharSequenceArray( String key,  CharSequence[] value)

//Bundle 类型
.with( Bundle bundle )

//Activity 跳转动画
.withTransition(int enterAnim, int exitAnim)

//其他类型
.withParcelable( String key, Parcelable value)
.withParcelableArray( String key,  Parcelable[] value)
.withSerializable( String key, Serializable value)
.withByteArray( String key, byte[] value)
.withTransition(int enterAnim, int exitAnim)

比如我想给TestARouterActivity传递一个“哈哈哈”, key = "aaa", value = "哈哈哈",直接上代码:

ARouter.getInstance()
        .build("/com/TestARouterActivity")
        .withString("aaa", "哈哈哈") 
        .navigation();

而我们只需要在TestARouterActivity 类里面注解一下获取:

@Route(path = "/com/TestARouterActivity")
public class TestARouterActivity extends AppCompatActivity {

    @Autowired(name = "aaa")
    public String mTestVaule;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
    }
}

OK,到这里,我们平时用到的Activity之间跳转的基本功能差不多都实现了,再来看点进阶的:

使用进阶ARouter

  • 监听ARouter过程
    在路由跳转的过程中,我们可以监听路由的过程,来观察我们的跳转是成功了还是失败了。
navigation(Context context, NavigationCallback callback)

NavigationCallback看名字就是到是个回调,我们就是通过它来知道跳转的结果怎么样了。NavigationCallback 的源码如下:

public interface NavigationCallback {

    /**
     * Callback when find the destination.
     * 找到了
     * @param postcard meta
     */
    void onFound(Postcard postcard);

    /**
     * Callback after lose your way.
     * 找不到了
     * @param postcard meta
     */
    void onLost(Postcard postcard);

    /**
     * Callback after navigation.
     * 跳转完了
     * @param postcard meta
     */
    void onArrival(Postcard postcard);

    /**
     * Callback on interrupt.
     * 被拦截了
     * @param postcard meta
     */
    void onInterrupt(Postcard postcard);
}

简单易用:

ARouter.getInstance()
       .build("/com/TestARouterActivity")
       .navigation(this, new NavCallback() {

             @Override
              public void onFound(Postcard postcard) {
                   Log.e("eeeee", "找到TestARouterActivity!");
              }

             @Override
              public void onLost(Postcard postcard) {
                   Log.e("eeeee", 找不到TestARouterActivity!");
              }

             @Override
              public void onArrival(Postcard postcard) {
                   Log.e("eeeee", "TestARouterActivity跳转完了!");
              }

             @Override
              public void onInterrupt(Postcard postcard) {
                    Log.e("eeeee", "TestARouterActivity被拦截了!");
              }
              });
  • ARouter的分组
    现在去看下我们之前怎么注解的TestARouterActivity的路由
@Route(path = "/com/TestARouterActivity")

解析一下这个path:
在path这个字符串里面,”com” 就代表路由分组的标识,“TestARouterActivity” 代表是TestARouterActivity类的标识。组的标识和类的标识都可以自己定义的,需要记住的是组标识和类标识之间用斜杠来区分 ”\”

那什么是组呢?
ARouter框架是分组管理,按需加载
解释起来就是,在程序的编译期ARouter扫描了所有的注册页面、服务、字段、拦截器...,那么在程序的运行期就不能一股脑全部加载进来,这样就会一次性加载太多东西。所以ARouter就用分组来管理。
ARouter在初始化的时候只会一次性地加载所有的Root结点,而不会加载任何一个Group结点,这样就会极大地降低初始化时加载结点的数量。
通俗点说吧,比如你把TestARouterActivity1,TestARouterActivity2,TestARouterActivity3分成一组(分组的标识是一样的),组名比如叫"com"。ARouter初始化的时候不会加载"com"这个Group结点,一旦你需要跳到TestARouterActivity3这个页面了,那么ARouter才会再将com这个组加载进来。

  • ARouter的自定义分组
    ARouter的分组可以自定义,我们创建一个TestARouterActivity2并且添加 ARouter注解,指定它的自定义路由分组。如下所示:
@Route(path = "/com/TestARouterActivity2" , group = "testGroup")
public class TestARouterActivity2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_group);
    }
}

上面代码中的"testGroup"就是TestARouterActivity2的自定义分组,如果我们不指定group字段,那么TestARouterActivity2的默认分组就是 "/ /"中间的"com"。我们可以代码验证一下:

@Route(path = "/com/TestARouterActivity2")
public class TestARouterActivity2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_group);
    }
}

····

ARouter.getInstance()
       .build("/com/TestARouterActivity2")
       .navigation(this, new NavCallback() {
            @Override
            public void onArrival(Postcard postcard) {
                Log.e("eeeee", "默认分组: " + postcard.getGroup());
            }
        });

上面代码打印的结果就是 默认分组:com
自定义分组我们怎么跳转呢?
很简单,自定义分组,发起路由:第二个参数就是路由的分组

build(String path, String group);

····

ARouter.getInstance().build("/com/TestARouterActivity2", "testGroup").navigation();
  • 关闭ARouter
    借用文档上的说明:关闭路由,这个操作慎用
ARouter.getInstance().destroy();

ARouter - Fragment

在Fragment中使用ARouter,和Activity中使用没多少差别
首先,创建 Fragment 类,并且添加路由注解

@Route(path = "/com/TestARouterFragment")
public class TestARouterFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_test, container, false);
        return view;
    }
}

然后,获取你的TestARouterFragment实例:

TestARouterFragment fragment = (TestARouterFragment)ARouter.getInstance().build( "/com/TestARouterFragment" ).navigation();

拿到了你的Fragment,然后该咋用就咋用

ARouter的混淆说明

-keep public class com.alibaba.android.arouter.routes.**{*;}
-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}

Ok,完事~

总结一下,ARouter是阿里巴巴开源出来的一款Android路由框架,使用起来很简单,没啥干货可以讲,这是它的地址
GitHub:https://github.com/alibaba/ARouter

感谢下面两篇博文:(两篇文章就能把它吃的透透的)
尤其第一篇,讲的简单易懂,这篇文章基本就是摘抄的原创了,加了点点我自己使用过程中的理解。我觉得自己能写下来可以涨不少见识,也能加深自己的理解

Android 路由框架ARouter最佳实践
谈android组件化之ARouter简单使用

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

推荐阅读更多精彩内容