Arouter 使用(一):

Arouter 使用(一):

官方git: https://github.com/alibaba/ARouter/blob/master/README_CN.md

一、Arouter 简介:

1、功能介绍

  1. 支持直接解析标准URL进行跳转,并自动注入参数到目标页面中
  2. 支持多模块工程使用
  3. 支持添加多个拦截器,自定义拦截顺序
  4. 支持依赖注入,可单独作为依赖注入框架使用
  5. 支持InstantRun
  6. 支持MultiDex(Google方案)
  7. 映射关系按组分类、多级管理,按需初始化
  8. 支持用户指定全局降级与局部降级策略
  9. 页面、拦截器、服务等组件均自动注册到框架
  10. 支持多种方式配置转场动画
  11. 支持获取Fragment
  12. 完全支持Kotlin以及混编(配置见文末 其他#5)
  13. 支持第三方 App 加固(使用 arouter-register 实现自动注册)
  14. 支持生成路由文档
  15. 提供 IDE 插件便捷的关联路径和目标类

2、使用场景:

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

二、Arouter 使用

2.1 ARouter 集成

添加依赖和配置

 defaultConfig {
        minSdkVersion Integer.parseInt(MIN_SDK_VERSION)
        targetSdkVersion Integer.parseInt(TARGET_SDK_VERSION)
        versionName "0.0.1"

        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName(), AROUTER_GENERATE_DOC: "enable"]  //AROUTER_GENERATE_DOC 是否生成路由文档
            }
        }
    }

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

2.2 Arouter 基本设置

初始化Arouter:

if (isDebug()) {// 这两行必须写在init之前,否则这些配置在init过程中将无效
    ARouter.openLog();// 打印日志
    ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(mApplication); // 尽可能早,推荐在Application中初始化

添加路由注解:

// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = "/test/activity1", name = "测试用 Activity")
public class Test1Activity extends AppCompatActivity {
    
}

2.3 跳转

使用 ARouter 时这里使用了3个比不可少的类:

ARouter:

Postcard :

2.4 动画

  • 转场动画

    • 旧版本转场动画

      ARouter.getInstance()
                              .build("/test/activity2")
          					//添加动画
                              .withTransition(R.anim.slide_in_bottom, R.anim.slide_out_bottom)
                              .navigation(this);
      
    • 新版本转场动画

       if (Build.VERSION.SDK_INT >= 16) {
                          ActivityOptionsCompat compat = ActivityOptionsCompat.makeScaleUpAnimation(v, v.getWidth() / 2,v.getHeight() / 2, 0, 0);
      
                          ARouter.getInstance()
                                  .build("/test/activity2")
                              	//添加动画
                                  .withOptionsCompat(compat)
                                  .navigation();
                      } else {
                          Toast.makeText(this, "API < 16,不支持新版本动画", Toast.LENGTH_SHORT).show();
                      }
      

2.5 拦截器

1、拦截器定义
拦截器用@Interceptor(priority = 7) 注释 如果有多个拦截器 拦截器按照顺序执行

@Interceptor(priority = 7)
public class TestInterceptor implements IInterceptor {
    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
        //继续分发
        callback.onContinue(postcard);
        //拦截
        callback.onInterrupt(null);
        //可以修改postcard 参数
        // postcard.方法
    }

    @Override
    public void init(Context context) {
        Log.i("grage","TestInterceptor");
    }
}

2.6 调用服务

Arouter 调用服务首先需要暴露一个 Service 的接口 :

public interface IMyService1 extends IProvider {
    void startService();
}

定义Service 实现接口 IMyService1:

@Route(path = "/test/service2")
public class Service2 implements IMyService1 {
    @Override
    public void init(Context context) {

    }

    @Override
    public void startService() {
        Log.i("grage","startService");
    }
}
  • ByName

      Service2 navigation = (Service2) ARouter.getInstance().build("/test/service2").navigation();
                    navigation.startService();
    
  • ByType

    ARouter.getInstance().navigation(IMyService1.class).startService();
    
  • 调用单类

    @Route(path = "/yourservicegroupname/single") //必须添加
    public class SingleService implements IProvider {
        @Override
        public void init(Context context) {
    
        }
    
        public void log(){
            Log.i("grage","SingleService");
        }
    }
    
         SingleService navigation = ARouter.getInstance().navigation(SingleService.class);
                    navigation.log();	
    

预处理服务:

@Route(path = "/servcice/pretreatmentServiceImpl")
public class PretreatmentServiceImpl implements PretreatmentService {
    @Override
    public boolean onPretreatment(Context context, Postcard postcard) {
        Log.i("grage","PretreatmentServiceImpl");
        //todo 跳转前预处理,如果需要自行处理跳转,该方法返回 false 即可
        return false;
    }

    @Override
    public void init(Context context) {

    }
}

如果返回false 那么启动服务 目标service build.navigation 返回对象为null

2.8 资源销毁

ARouter.getInstance().destroy();

补充自定义传值:

// 如果需要传递自定义对象,新建一个类(并非自定义对象类),然后实现 SerializationService,并使用@Route注解标注(方便用户自行选择序列化方式),例如:
@Route(path = "/yourservicegroupname/json")
public class JsonServiceImpl implements SerializationService {
    @Override
    public void init(Context context) {

    }

    @Override
    public <T> T json2Object(String text, Class<T> clazz) {
        return JSON.parseObject(text, clazz);
    }

    @Override
    public String object2Json(Object instance) {
        return JSON.toJSONString(instance);
    }
}

你可能感兴趣的:(android)