Android路由ARouter初步体验

作者: 在寻找雪见的景天 | 来源:发表于2017-03-29 15:25 被阅读4551次

    前言

    什么是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进行开发,而不会互相影响。

    相关文章

      网友评论

      • 47bf56b0ca08:这个可以从 app的activity 到 module的activity1 ----》 module的activity1 到module的activity2, 又原路返回到app的activity吗?
        在寻找雪见的景天:@f1184104588 可以的

      本文标题:Android路由ARouter初步体验

      本文链接:https://www.haomeiwen.com/subject/qhweottx.html