Arouter学习笔记--使用

1、集成
参考官方文档https://github.com/alibaba/ARouter
在module的build.gradle中添加对应引用,注意版本对齐

defaultConfig {
       ......
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }
dependencies {
   .....
    implementation 'com.alibaba:arouter-api:1.5.0'
    annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'

}

2、使用
在Application里初始化

 ARouter.init(this);

在对应的页面使用注解标记页面路由路径,有严格的规则,以 /…/… 格式 例如

@Route(path = "/module1/mainActivity")
public class Module1_MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.module1_main_activity);
    }
}

标记之后编译项目 会在build文件中生成对应标记类
Arouter学习笔记--使用_第1张图片
在想跳转的地方调用跳转api

 ARouter.getInstance().build("/module1/mainActivity").navigation();

传参数和接收参数,所有基础类型和序列化的都可以,不满足的也可用bundle

ARouter.getInstance().build("/module1/mainActivity").withString("key","参数").navigation();

接收参数 使用注解和注入

@Route(path = "/module1/mainActivity")
public class Module1_MainActivity extends AppCompatActivity {

    @Autowired
    String key;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.module1_main_activity);
        ARouter.getInstance().inject(this);
        Log.d("Module1_MainActivity", key);
    }
}

简单的跳转和参数传递基本可以满足日常需求,达到模块化的解耦,没有模块直接依赖,必然在引用方面是比较麻烦的,如找目标类,维护路由表

3、高级用法 模块之间通信
除了界面跳转之外,Arouter还能跨模块调用其他模块实现的方法
1 、在基础模块定义接口 继承 IProvider

public interface TestServer extends IProvider {
      void callServer();
}

其他模块依赖基础模块,实现服务,并设置好对应路由路径
例如 模块1

@Route(path = "/module1/server")
public class Module1Server implements TestServer {
    @Override
    public void init(Context context) {

    }

    @Override
    public void callServer() {
        Log.d("Module1Server", "模块1的服务");
    }
}

模块2

@Route(path = "/module2/server")
public class Module2Server implements TestServer {
    @Override
    public void callServer() {
      Log.d("Module2Server", "模块2的服务");
    }

    @Override
    public void init(Context context) {

    }
}

此时模块1和模块2没有依赖关系 通过控制反转 ioc 注入 初始化对象实例
如模块1调用模块2方法

@Route(path = "/module1/mainActivity")
public class Module1_MainActivity extends AppCompatActivity {

    @Autowired(name = "/module2/server")
    TestServer testServer;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.module1_main_activity);
        ARouter.getInstance().inject(this);
        
        testServer.callServer();
    }
}

通过注解的路由路径找到要实例化的类

@Autowired(name = "/module2/server")
    TestServer testServer;

通过注入 初始化

ARouter.getInstance().inject(this);

即可把testServer 实例化成 Module2Server 对象了

4、拦截器
声明拦截器,这里是注解实现的,是全局的拦截器。例如:登陆问题

@Interceptor(priority = 2)
public class MyInterceptor implements IInterceptor {
    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
      Log.d("MyInterceptor", "拦截器");
      callback.onContinue(postcard);
    }

    @Override
    public void init(Context context) {

    }
}

5、降级服务
统一处理跳转失败的情况 path 随便写

/**
 * 降级服务  path  任意
 * */
@Route(path = "/aaa/aaa")
public class DegradeServiceImpl implements DegradeService {
    @Override
    public void onLost(Context context, Postcard postcard) {
        Log.d("DegradeServiceImpl", "postcard:" + postcard);
    }

    @Override
    public void init(Context context) {

    }
}

日常使用 足够了

你可能感兴趣的:(android,知识分享)