前言
组件化作为Android客户端技术的一个重要分支,近年来一直是业界积极探索和实践的方向。
为什么要组件化
近年来,为什么这么多团队要进行组件化实践呢?组件化究竟能给我们的工程、代码带来什么好处?我们认为组件化能够带来两个最大的好处:
提高组件复用性
可能有些人会觉得,提高复用性很简单,直接把需要复用的代码做成Android Module,打包AAR并上传代码仓库,那么这部分功能就能被方便地引入和使用。但是我们觉得仅仅这样是不够的,上传仓库的AAR库是否方便被复用,需要组件化的规则来约束,这样才能提高复用的便捷性。
降低组件间的耦合
我们需要通过组件化的规则把代码拆分成不同的模块,模块要做到高内聚、低耦合。模块间也不能直接调用,这需要组件化通信框架的支持。降低了组件间的耦合性可以带来两点直接的好处:第一,代码更便于维护;第二,降低了模块的Bug率。
组件间如何通信
组件间通过接口通信。为每一个组件定义一个或者多个接口,简单起见,我们假定只为每一个组件定义接口(多个接口是类似的)。
便于理解,还是要举实例。假设当前存在两个组件UserManagement(用户管理)和OrderCenter(订单中心),我们为组件接口定义的模块的名为ComponentInterface。UserManagement和OrderCenter都依赖于ComponentInterface。为了有个直观的感受,还是放张图:
在ComponentInterface模块中新建为组件UserManagement的定义接口:
public interface UserManagementInterface
{
//获取用户ID
String getUserId();
}
UserManagement实现ComponentBInterface:
public class UserManagementInterfaceImpl implements UserManagementInterface
{
@Override
public String getUserId()
{
return “UID_XXX”;
}
}
现在假定OrderCenter组件需要从UserManagement获取用户ID以便加载该用户的订单列表。那么问题来了,OrderCenter怎么才能调用到UserManagement的组件实现呢?这个问题可以通过反射来解决,只是需要满足组件的接口和组件接口的实现的路径和名称满足一定的约束条件。
我们定义组件接口和其实现的路径和名称的约束条件如下:
1.组件的接口和组件接口的实现必须定义在同一个包名下。
2.组件接口的实现的类名可以通过组件的接口的类名推导出来。比如每一个接口的实现的类名都是在该接口的名称后面接上“Impl”。
那么现在,我们的工程目录大概就像这个样子:
接下来,在OrderCenter组件中就可以通过反射获取到UserManagement组件接口的实现了,我们定义一个ComponentManager类:
public class ComponentManager
{
public static <T> T of(Class<T> tInterface)
{
String interfaceName = tInterface.getCanonicalName();
String implName = interfaceName + “Impl”;
try
{
T impl = (T) Class.forName(implName).newInstance();
return impl;
}
catch (Exception ex)
{
ex.printStackTrace();
return null;
}
}
}
然后在OrderCenter就可以通过ComponentManager来获取UserManagement的组件接口实现了:
String userId = ComponentManager.of(UserManagementInterface.class).getUserId();
至此,组件间通信的问题就算解决了,而且组件之间还是不存在强依赖。
组件的代码如何隔离
由于组件之间是不能相互直接依赖,所以组件间也不存在代码隔离的问题。问题主要出现在App壳上,App壳依赖了所有的组件,如果采用implementation依赖方式,在App壳中还是能够访问组件中的代码的,我们可以采用runtimeOnly这种依赖方式。
其实组件化 还有很多很多知识需要探索
如:组件的资源如何隔离
渐进式组件化
组件如何单独运行
页面跳转
下面是小编整理的一些组件化视频学习资料,需要的话加群:4112676 验证:组件化,即可免费领取
组件化知识点介绍
组件化全套视频,加群 4112676 验证:组件化,即可免费领取