了解AndroidRouter,实现Android应用程序的模块化

发布时间:2023-05-19

一、AndroidRouter简介

AndroidRouter是一个轻量级的Android组件化框架。 它主要用于应用的模块化和解耦,并且可以方便地在应用程序中使用这些模块。同时,使用这个框架可以轻松地实现各模块间的通讯、数据传递和事件分发等功能。

二、AndroidRouter的基本用法

1、导入依赖

在项目的build.gradle文件中添加以下依赖项:

dependencies {
   implementation 'com.alibaba:arouter-api:1.5.1'
   annotationProcessor 'com.alibaba:arouter-compiler:1.2.4'
}

2、初始化

在应用程序的Application中初始化ARouter:

public class MyApplication  extends Application {
   @Override
   public void onCreate() {
       super.onCreate();
       ARouter.init(this);
   }
}

3、定义路由

通过在每个组件子模块中注册路由,来实现代码的模块化。

//在模块A中注册路由
@Route(path = "/moduleA/activity")
public class ModuleAActivity extends AppCompatActivity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_module_a);
   }
}
//在模块B中注册路由
@Route(path = "/moduleB/activity")
public class ModuleBActivity extends AppCompatActivity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_module_b);
   }
}

4、跳转到目标Activity

在需要跳转到目标Activity的地方,使用ARouter API通过路由路径构建跳转Intent,然后启动该Intent。

ARouter.getInstance().build("/moduleA/activity").navigation();
ARouter.getInstance().build("/moduleB/activity").navigation();

5、携带参数跳转

在构建Intent的时候,可以使用withXxx()方法来携带参数

//跳转到ModuleAActivity并携带参数
ARouter.getInstance().build("/moduleA/activity")
   .withString("param1", "value1")
   .withInt("param2", 123)
   .navigation();

三、其他功能

1、拦截器

拦截器可以用于在路由的前后进行拦截处理,比如在路由跳转之前检查用户是否已经登录。

//定义登录拦截器
@Interceptor(priority = 8, name = "login")
public class LoginInterceptor implements IInterceptor {
   @Override
   public void process(Postcard postcard, InterceptorCallback callback) {
       if (TextUtils.equals("user", postcard.getPath())) {
           if (LoginUtil.isLogin()) {
               callback.onContinue(postcard);
           } else {
               callback.onInterrupt(new RuntimeException("please login"));
           }
       } else {
           callback.onContinue(postcard);
       }
   }
   @Override
   public void init(Context context) {
   }
}
//添加拦截器到ARouter
ARouter.getInstance().addInterceptor(new LoginInterceptor());

2、自定义注解

ARouter支持自定义注解,可以更方便地进行参数传递和路由匹配。

//定义自定义注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
@Route(path = "/module/coupon")
public @interface CouponRouter {
   String discount();
}
//使用自定义注解
@CouponRouter(discount = "0.5")
public class CouponActivity extends AppCompatActivity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       String discount = getIntent().getStringExtra("discount");
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_coupon);
       TextView textView = findViewById(R.id.text);
       textView.setText("discount:" + discount);
   }
}
//通过自定义注解跳转
ARouter.getInstance()
   .build(RouteConstants.CouponRouter)
   .withString("discount","0.5")
   .navigation();

3、参数注入

ARouter支持使用@Autowired注解进行参数注入,可以更方便地实现页面间数据传递。

//在ModuleA子模块中定义跳转参数
@Route(path = "/moduleA/info")
public class InfoActivity extends AppCompatActivity {
   @Autowired
   String name;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_info);
       TextView textView = findViewById(R.id.text);
       textView.setText("name:" + name);
   }
}
//在ModuleB子模块中跳转并传递参数
ARouter.getInstance()
   .build("/moduleA/info")
   .withString("name", "Tom")
   .navigation();

四、总结

AndroidRouter是一个轻量级的Android组件化框架,主要用于应用的模块化和解耦。使用该框架可以方便地实现各模块间的通讯、数据传递和事件分发等功能。同时,该框架还支持拦截器、自定义注解和参数注入等功能,可以根据实际需要进行使用。