Day1 calces组件化+ARouter路由框架
一.calces组件化
1.calces组件化介绍
- 官网
https://github.com/Tangpj/calces-gradle-plugin - 什么是组件化
就是将一个App分成多个模块,每个模块都是一个组件(Module),开发过程中我们可以让这些组件相互依赖,或者单独调试部分组件等,但是最终发布的时候就是将这些组件合并成统一的Apk。 - 为什么要组件化
随着产品的迭代,业务越来越复杂,随之带来的是项目结构复杂度极度增加,此时就会有如下几个问题:
1、业务变化太快,单一的工程业务模块耦合度太高,牵一发动全身
2、对工程作任何修改都需要编译整个工程
3、功能测试和系统测试每次都需要进行
4、团队协作开发存在很多冲突,不得不花费时间和精力进行沟通,影响效率
5、不能灵活的对业务模块进行配置和组装.
2.如何实现calces自动组件化:
(1)项目gradle:
注意:必须放在buildscript和allprojects的中间位置,不然报错
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.2'
}
}
/*****************************************/
plugins{
id "calces.appconfig" version "3.3.0-alpha01"
}
appConfig {
debugEnable false /*是否能调试*/
apps {
app {
applicationName ".App" /**可选*/
mainActivity ".MainActivity"
modules ':pay',
':sao',
':lib_core'
}
}
modules {
pay {
applicationId "com.bawei.pay"
mainActivity ".MainActivity"
isRunAlone true
name ":pay"
}
sao {
applicationId "com.bawei.sao"
mainActivity ".MainActivity"
isRunAlone true
name ":sao"
}
lib_core {
applicationId "com.bawei.lib_core"
mainActivity ".MainActivity"
isRunAlone true
name ":lib_core"
}
}
}
/*****************************************/
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
(2)app主moudle的gradle:
apply plugin: 'calces.modules'
(3)其他moudle的gradle:
apply plugin: 'calces.modules'
(4)app moudle配置App:
二.ARouter路由框架
1.ARouter介绍
- 官网:https://github.com/alibaba/ARouter/blob/master/README_CN.md
- 作用:阿里巴巴自研路由框架,主要解决组件间、模块间的 界面跳转 问题
- 应用:
(1)从外部URL映射到内部页面,以及参数传递与解析
(2)跨模块页面跳转,模块间解耦
(3)拦截跳转过程,处理登陆、埋点等逻辑
(4)跨模块API调用,通过控制反转来做组件解耦
2.配置
(1)每个gradle配置:
- defaultConfig 里:
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
} - 依赖:
implementation (‘com.alibaba:arouter-api:1.5.2’) //ARouter依赖 //版本要改成最新版本
annotationProcessor ‘com.alibaba:arouter-compiler:1.5.2’ //ARouter依赖
(2)application中初始化sdk
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
Log.d("ytx", "onCreate: ");
ARouter.openDebug();
ARouter.openLog();
ARouter.init(this);
}
}
3.路由跳转
(1)组件间跳转:app—>pay
app:
//app页面跳转到pay页面
public void pay(View view) {
ARouter.getInstance()
.build("/pay/MainActivity")
.navigation();
}
pay:
1.注意布局文件名不能相同
2.注意路径一般和moudle名/activity名
@Route(path = "/pay/MainActivity")
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pay);
}
}
}
(2)组件间跳转传值:app—>pay
app:
//app页面跳转到pay页面
public void pay(View view) {
ARouter.getInstance()
.build("/pay/MainActivity")
.withString("name","yaotianxue")
.navigation();
}
pay:
@Route(path = "/pay/MainActivity")
public class MainActivity extends AppCompatActivity {
@Autowired
String name;//注意不能是私有的 名字要一致
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pay);
ARouter.getInstance().inject(this);//传值的时候必须注册
Toast.makeText(this, ""+name, Toast.LENGTH_SHORT).show();
}
}
}
(3)组件间跳转传对象
app:
//app页面跳转到pay页面
public void pay(View view) {
ARouter.getInstance()
.build("/pay/MainActivity")
.withObject("good",new Good("手机",45.6f))
.navigation();
}
pay:
@Route(path = "/pay/MainActivity")
public class MainActivity extends AppCompatActivity {
@Autowired
Good good;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pay);
ARouter.getInstance().inject(this);//传值的时候必须注册
Toast.makeText(this, ""+good, Toast.LENGTH_SHORT).show();
}
}
}
- 传对象的时候注意创建JsonBean文件:
@Route(path = "/app/json")
public class JsonBean implements SerializationService {
@Override
public <T> T json2Object(String input, Class<T> clazz) {
return new Gson().fromJson(input,clazz);
}
@Override
public String object2Json(Object instance) {
return new Gson().toJson(instance);
}
@Override
public <T> T parseObject(String input, Type clazz) {
return new Gson().fromJson(input,clazz);
}
@Override
public void init(Context context) {
}
}
(2)用路由动态添加fragment
- 创建fragment
@Route(path = "/pay/fragment/BlankFragment")
public class BlankFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_blank, container, false);
}
}
- 使用路由查找
public void btn3(View view) {
Fragment fragment = (Fragment) ARouter.getInstance().build("/pay/fragment/BlankFragment").navigation();
getSupportFragmentManager().beginTransaction().add(R.id.ll,fragment).commit();
三.calces和arouter结合使用的注意事项
- 各个moudle之间的布局文件不能重名
- 自动组件化会自动生成一个清单文件,创建activity的时候需要再原来的清单中手动添加fragment