Android路由ARouter初步体验

前言

什么是ARouter?阿里巴巴官方解释是:Android平台中对页面、服务提供路由功能的中间件。那又是什么鬼,有啥功能,什么场合适合使用?官方给的说明是:

一、功能介绍

1、支持直接解析标准URL进行跳转,并自动注入参数到目标页面中
2、支持多模块工程使用
3、支持添加多个拦截器,自定义拦截顺序
4、支持依赖注入,可单独作为依赖注入框架使用
5、支持InstantRun
6、支持MultiDex(Google方案)
7、映射关系按组分类、多级管理,按需初始化
8、支持用户指定全局降级与局部降级策略
9、页面、拦截器、服务等组件均自动注册到框架
10、支持多种方式配置转场动画
11、支持获取Fragment

二、典型应用

1、从外部URL映射到内部页面,以及参数传递与解析
2、跨模块页面跳转,模块间解耦
3、拦截跳转过程,处理登陆、埋点等逻辑
4、跨模块API调用,通过控制反转来做组件解耦

好了,这些理论啥的我就不说了,具体也可以去官方地址查看:https://github.com/alibaba/ARouter
接下来我们来看看怎么使用,一步一步来

使用说明

1、在project gradle里面添加

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.0' //推荐是2.3以上
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //路由需要
    }
}

2、在 app 和 module 的 gradel 添加依赖

android {
    defaultConfig {
    ...
    javaCompileOptions {
        annotationProcessorOptions {
        arguments = [ moduleName : project.getName() ]
         }
      }
    }
}

dependencies {
    // 替换成最新版本, 需要注意的是api
    // 要与compiler匹配使用,均使用最新版可以保证兼容
   compile 'com.alibaba:arouter-api:1.2.0'
   annotationProcessor 'com.alibaba:arouter-compiler:1.1.0'
    ...
}

3、新建两个module(lib),然后让app都依赖这两个module

dependencies {
   compile 'com.alibaba:arouter-api:1.2.0'
   annotationProcessor 'com.alibaba:arouter-compiler:1.1.0'

    //添加下面两个依赖
    compile project(':module1') 
    compile project(':module2')
}

4、在两个module里面都新建一个activity,目的是测试模块化跳转。实验证明,只要app依赖了这两个module,module之间不需再互相依赖就可以实现从module1跳转到module2 。

//添加注解,path必须为 /XX/OO 的形式
@Route(path = "/module1/main")
public class Module1Activity extends AppCompatActivity {

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

        String data = getIntent().getStringExtra("data");
        Toast.makeText(this, "传递的参数:" + data, Toast.LENGTH_LONG).show();
    }
}

5、然后从app的activity跳转到module的activity

public class MainActivity extends AppCompatActivity {

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

        ARouter.init(getApplication());// 初始化,建议放在application里面
        ARouter.openLog();     // 打印日志
        ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (data == null) {
            Log.e("---", "------------空--------------");
            return;
        }
        if (requestCode == 100 && resultCode == 0) {
            String key = data.getExtras().getString("key");
            Toast.makeText(MainActivity.this, "回调的内容:" + key, Toast.LENGTH_LONG).show();
        }
    }

    //跳去module1的页面
    public void module(View view) {
        //不用activityResult
        ARouter.getInstance()
                .build("/module1/main") //内容就是想跳转去那个module注解的path
                .withString("data", "app传过来的内容") //传参,不用就不需写啦
                .navigation();

        //使用activityResult,相当于 startActivityForResult
        ARouter.getInstance()
                .build("/module1/main")
                .withString("data", "app传过来的内容")
                .navigation(MainActivity.this, 100);

        //上面的处理和下面的处理功能一样
        Intent intent = new Intent(this, Module1Activity.class);
        intent.putExtra("data", "app传过来的内容");
        startActivityForResult(intent, 100);
    }
}

6、加入混淆

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

总结

好啦,上面的用法只是基本功能使用,进阶功能下篇再写吧。然后问题来了,用这个路由,优势在哪里?解耦,主要应该就是这个吧。当项目非常大的时候,需要有很多组件整合的时候,团队可以分别对这些module进行开发,而不会互相影响。

    原文作者:在寻找雪见的景天
    原文地址: https://www.jianshu.com/p/fb20ab18c4cb
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞