基于Android组件的开发实践(八):如何在组件生命周期中实现自动注册管理


浏览:985 次

1.前言

有一章是关于组件生命周期管理的,请参阅。以前,它只是解释组件生命周期的概念以及这样做的原因。然而,在实现过程中,会发现shell项目中会有很多硬编码。如果您引入的组件有一个实现BaseAppLike的类,则必须在shell项目中应用该类。onCreate()方法手动实例化该类。如果删除类似的组件,也必须删除相应的代码。这显然是不灵活的,因为它要求shell项目的维护人员知道项目引入的组件中有多少类实现了BaseAppLike。如果忘记了一个或多个类,app可能会出现问题。因此,我们当前的目标是自动识别所有组件的BaseAppLike类,而无需在添加或删除组件时修改任何代码。

2.实施思路

那么,app运行时如何识别实现BaseAppLike的所有类?首先,我将谈谈我自己的想法。在我阐明了我的想法之后,我们将逐步实施这项技术。

初步想法:

定义注释以标识实现BaseAppLike的类。

通过APT技术,在组件编译期间扫描和处理前面定义的注释,以生成BaseAppLike的代理类,称为BaseAppLikeProxy。所有代理类都使用相同的包名称。此包名称必须仅包含代理类,并且类名由固定规则生成,以确保不同组件生成的代理类的类名不重复。

组件生命周期管理类是必需的。在初始化过程中,我们可以扫描固定包名和类文件名下有多少类文件。固定包名称是我们之前生成的BaseAppLikeProxy的包名称。代理类都放在同一个包名下,这样我们就可以通过包名找到所有的目标类。

组件集成后,在app中调用组件生命周期管理类的初始化方法。onCreate()方法。

在组件生命周期管理类中,扫描所有BaseAppLikeProxy类名,然后通过反射实例化该类。

初步技术困难:

您需要了解APT技术以及如何在编译期间动态生成java代码;

app在运行时如何扫描包名称下的类数及其名称;

进一步思考:

在之前的想法中,当一个app正在运行时,它可能需要扫描所有的类,然后通过类文件的包名来判断它是否是我们的目标类,但我们可能只使用几个,这显然是低效的。我们可以在运行时知道所有BaseAppLikeProxy类名而不扫描所有类文件吗?第一个想法是使用gradle插件技术在app打包和编译期间动态插入字节码。在这里,我们将遇到几个技术难题:

如何制作渐变插件。

如何在打包时动态插入字节码。

3.从0开始

接下来,我们将循序渐进地解决遇到的问题,看看如何实现组件生命周期的自动注册管理。使用的技术包括APT、groovy语言、gradle插件技术和动态生成字节码的ASM。通常,我们在开发app时不需要知道这些,所以这会很困难。

3.1注释定义

在Android Studio中,创建一个新的Java库模块,我将其命名为生命周期注释。在模块中创建一个注释类,并创建一个相关的配置,以便稍后生成代理类,如下图所示:

相关代码如下:

//注释类只能用于注释类

@保留(RetentionPolicy.CLASS)

@目标(ElementType.TYPE)

public@interface应用生命周期{

}

公共类LifeCycleConfig{

/**

*要生成的代理类的包名称。包名称下不允许其他无关的业务类

*/

公共静态最终字符串PROXY_ CLASS_PACKAGE_NAME=“com.hm.iou.lifice.apt.PROXY”;

/**

*生成代理类的统一后缀

*/

公共静态最终字符串PROXY_CLASS_SUFFIX=“$$PROXY”;

/**

*为代理类生成统一前缀

*/

公共静态最终字符串PROXY_CLASS_PREFIX=“Heima$$”;

}

3.2重新定义IAppLike接口

创建一个名为lifecycle api的Android Library模块。在此模块中定义IAppLike接口和生命周期管理类。

为了生成代理类,我们定义了一个接口IAppLike,组件只需要实现它。同时

相关资讯:
什么是新订单系统

什么是新订单系统

查看
农产品分销软件如何帮助农产品分销

农产品分销软件如何帮助农产品分销

查看
如何成为一名程序员?这是重要的几点

如何成为一名程序员?这是重要的几点

查看
什么是域名归档?我们为什么要归档?备案后,您将获得以下好处!

什么是域名归档?我们为什么要归档?备案后,您将获得以下好处!

查看
上网速度慢。我该怎么办?

上网速度慢。我该怎么办?

查看