calces组件化与ARouter组件间通信
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"
- 在项目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
}
}
}
- 在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'
- 添加注解
// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = "/test/activity")
public class YourActivity extend Activity {
...
}
- 初始化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. 应用内简单的跳转(通过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);
}
}