calces组件化与ARouter组件间通信

阎辰钊
2023-12-01


https://github.com/Tangpj/calces-gradle-plugin

calces介绍:

Android构建工具包,这个工具的主旨是使用脚本自动处理机械化的重复劳动,让开发者专注更有价值的工作。 目前提供自动组件化控制与屏幕适配插件。

功能介绍
自动组件化构建插件

根据Gradle配置,自动实现Android组件的构建模式(application or library)
可配置多个依赖不同组件的App
自动要依赖需要的组件
自动配置组件独立运行(被依赖)时的AndroidManifest文件格式,即独立运行时自动配置启动Activity

快速开始
自动组件化构建插件
//项目build.gradle(大象)中操作
1. 引入依赖库, 在Gradle2.1及更高版本的插件构建脚本代码: 在项目的build.gradle中(大象)

   buildscript {
       ...
   }
   
   plugins {
     id "calces.appconfig" version "3.3.0-alpha01"
   }

在较旧版本的Gradle中或需要动态配置的情况下的插件构建脚本代码:

	buildscript {
 	    repositories {
	       maven {
	         url "https://plugins.gradle.org/m2/"
	       }
	     }

	     dependencies {
	       classpath "gradle.plugin.com.tangpj.tools:component:3.3.0-alpha01"
	     }
	   }
   
	   apply plugin: "calces.appconfig"

  1. 在项目build.gradle配置AppConfig
appConfig {
    debugEnable true
    apps {
        app1 {
            mainActivity "com.xxx.MainActivity1"
            modules ':modules1',
                    ':modules2'
        }

          app2 {
            mainActivity "com.xxx.MainActivity2"
            modules ':modules1'
        }
    }

    modules {
        modules1 {
            applicationId "com.xxxx.modules1"
            mainActivity ".Modules1Activity"
            isRunAlone true
        }

         modules2 {
            applicationId "com.xxxx.modules2"
            mainActivity ".Modules2Activity"
            isRunAlone true
        }
    }
} 
  1. 在modules(子模块)引入模块自动化构建插件 (注意:不需要手动配置com.android.library或com.android.application)
	 //添加在首行
	 apply plugin: 'calces.modules'

属性介绍

自动组件化构建插件
AppConfig

debugEnable, 布尔值 是否开个debug模式,只有当debugEnbale为true时,modules的isRunAlone才能生效。即modoules只能在debug模式中独立启动

apps, String列表 app列表,控制当debug模式为false时的app数量与基础配置

modules, String列表 组件列表,配置需要实现自动组件化控制的组件列表

App(apps里面的配置项)

name, String类型 app的名字,需要和项目路径对应,如果不填写默认为该配置的名字(如配置名为app的话,name则为:name)。导入规则和setting.gradle中的include规则保持一致
modules, String列表 需要依赖的组件列表,通过修改该属性实现依赖不同的组件
dependMethod, String类型 依赖的方法,默认为implementation,一般不需要配置该字段,除非有特殊需求
applicationId, String类型 动态填入applicationId。非特殊情况,建议为空
applicationName, String类型 配置启动Application(对应manifest中的application name属性)
mainActivity, String类型 配置启动Activity,为空则默认为AndroidManifest中的Activity。非特殊情况,建议为空
Modules(modules里的配置项)

name, String类型 与app中的name一致

isRunAlone, 布尔值 该组件能否独立启动

applicationId, String类型 独立启动时的applicationId

applicationName, String类型 配置启动Application(对应manifest中的application name属性)

mainActivity, String类型 独立启动的Activity

///
//
/

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

ARouter(路由)

典型应用

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

基本功能
1. 添加依赖和配置(所有要使用的应用build.gradle中都要添加)(小象)

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

// 依赖 (注意括号)

	implementation ('com.alibaba:arouter-api:1.4.1')
    annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
// 依赖说明
dependencies {
    // 替换成最新版本, 需要注意的是api
    // 要与compiler匹配使用,均使用最新版可以保证兼容
    compile 'com.alibaba:arouter-api:x.x.x'
    annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
    ...
}
// 旧版本gradle插件(< 2.2),可以使用apt插件,配置方法见文末'其他#4'
// Kotlin配置参考文末'其他#5'
  1. 添加注解
// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = "/test/activity")
public class YourActivity extend Activity {
    ...
}
  1. 初始化SDK(新建Application, 在Application中操作)
	ARouter.openLog();     // 打印日志
	ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
	ARouter.init(this);
// 使用说明
if (isDebug()) {           // 这两行必须写在init之前,否则这些配置在init过程中将无效
    ARouter.openLog();     // 打印日志
    ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(mApplication); // 尽可能早,推荐在Application中初始化
  1. 发起路由操作
    // 1. 应用内简单的跳转(通过URL跳转在’进阶用法’中)
    ARouter.getInstance().build("/test/activity").navigation();

// 2. 跳转并携带参数

ARouter.getInstance().build("/test/1")
             .withLong("key1", 666L)
             .withString("key3", "888")
             .withObject("key4", new Test("Jack", "Rose"))
             .navigation();

解析参数:

// 为每一个参数声明一个字段,并使用 @Autowired 标注
// URL中不能传递Parcelable类型数据,通过ARouter api可以传递Parcelable对象
@Route(path = "/test/activity")
public class Test1Activity extends Activity {
    @Autowired
    public String name;
    @Autowired
    int age;
    
 // 通过name来映射URL中的不同参数
    @Autowired(name = "girl") 
    boolean boy;
    
 // 支持解析自定义对象,URL中使用json传递
    @Autowired
    TestObj obj;      
    
// 使用 withObject 传递 List 和 Map 的实现了
// Serializable 接口的实现类(ArrayList/HashMap)
// 的时候,接收该对象的地方不能标注具体的实现类类型
// 应仅标注为 List 或 Map,否则会影响序列化中类型
// 的判断, 其他类似情况需要同样处理        
    @Autowired
    List<TestObj> list;
    @Autowired
    Map<String, List<TestObj>> map;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ARouter.getInstance().inject(this);

    // ARouter会自动对字段进行赋值,无需主动获取
    Log.d("param", name + age + boy);
    }
}


// 如果需要传递自定义对象,新建一个类(并非自定义对象类),然后实现 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);
    }
}
 类似资料: