一种适配非final资源ID的Android控件混合绑定方法及系统与流程

摘要: 本技术涉及android开发,特别是涉及一种适配非final资源id的android控件混合绑定方法及系统。背景技术:1、随着移动终端技术的发展,android...
一种适配非final资源ID的Android控件混合绑定方法及系统与流程

本技术涉及android开发,特别是涉及一种适配非final资源id的android控件混合绑定方法及系统。

背景技术:

1、随着移动终端技术的发展,android应用所承载的业务功能不断增多,应用界面通常由文本显示、信息输入、功能按钮、列表展示及自定义视图等多种控件构成。在android应用开发过程中,布局文件中的控件需要与程序代码中的相应对象建立关联,以便程序对控件执行数据设置、状态更新、事件响应及交互控制等操作。因此,控件对象的获取与管理是android应用界面开发中的基础环节,其处理效率和可靠性会对应用的开发维护及运行稳定性产生影响。

2、现有技术中,通常由开发人员根据控件的资源标识逐一查找控件对象,或者借助自动化工具完成控件与程序字段之间的关联。逐一查找控件对象需要编写较多重复代码,随着页面控件数量增加,容易出现控件遗漏、资源引用错误或对象类型不匹配等情况。现有自动化处理方式在一定程度上能够减少重复操作,但不同方式往往分别侧重于处理效率或使用灵活性,难以适应不同类型的页面及工程环境;并且,随着android开发工具、资源管理方式以及工程组织方式的变化,部分自动化处理方式可能出现资源信息难以正确获取、控件关联失败或运行开销增加等问题。在包含多个业务模块的应用工程中,还可能出现不同模块之间的信息重复或处理结果相互影响的情况。此外,现有控件关联过程对控件未找到、对象类型异常及处理过程发生错误等情况的容错能力有限,页面退出后遗留的控件引用也可能增加内存占用,影响应用运行的稳定性。

3、因此,在android控件实例化过程中,资源管理方式变化导致的控件关联兼容性不足、不同页面场景下处理效率与适应性难以兼顾、多模块工程中的控件关联容易相互影响以及异常控件和失效引用难以及时处理,成为亟需解决的问题。

技术实现思路

1、本技术提供一种适配非final资源id的android控件混合绑定方法及系统,旨在解决现有技术在android控件实例化过程中,资源管理方式变化导致的控件关联兼容性不足、不同页面场景下处理效率与适应性难以兼顾、多模块工程中的控件关联容易相互影响以及异常控件和失效引用难以及时处理的问题。

2、第一方面,一种适配非final资源id的android控件混合绑定方法,所述方法包括:

3、获取目标android工程中各工程模块的资源编译结果以及目标类中各待绑定字段对应的控件绑定标记,根据所述控件绑定标记确定各待绑定字段的绑定类型和控件资源信息,所述绑定类型包括编译期绑定类型和运行时绑定类型,所述运行时绑定类型对应的控件资源信息包括控件资源名称;

4、按照各工程模块的模块命名空间,将所述资源编译结果中的控件资源名称与控件资源id进行关联,分别生成各工程模块对应的、相互隔离的资源映射信息,针对所述编译期绑定类型的待绑定字段生成对应的编译期绑定代码,并建立所述目标类与对应的编译期绑定代码及资源映射信息之间的关联关系;

5、响应于针对待绑定目标对象的控件绑定请求,获取所述待绑定目标对象对应的根视图,所述待绑定目标对象为所述目标类的对象实例,并根据各待绑定字段的绑定类型执行对应的控件绑定处理;

6、对于所述编译期绑定类型的待绑定字段,调用对应的编译期绑定代码,直接从所述根视图中查找对应的控件实例,并将所述控件实例赋值给所述待绑定字段;

7、对于所述运行时绑定类型的待绑定字段,根据所述待绑定目标对象所属的工程模块和对应的控件资源名称查询所述资源映射信息,得到对应的控件资源id,并根据所述控件资源id从所述根视图中查找对应的控件实例;

8、对针对所述运行时绑定类型查找到的控件实例进行空值校验和字段类型匹配校验,在校验通过时通过反射将所述控件实例赋值给对应的待绑定字段,并在当前待绑定字段的反射赋值发生异常时,终止当前待绑定字段的绑定处理并继续处理其他待绑定字段;

9、监测所述待绑定目标对象对应的页面或视图的生命周期状态,并在所述页面或视图进入销毁状态时,清空各已绑定字段中的控件实例引用,并释放绑定过程中保存的关联信息。

10、上述方案中,可选地,所述按照各工程模块的模块命名空间,将所述资源编译结果中的控件资源名称与控件资源id进行关联,分别生成各工程模块对应的、相互隔离的资源映射信息,包括:

11、在所述目标android工程的资源编译完成后,解析各工程模块对应的资源符号信息,得到各控件资源对应的模块命名空间、控件资源类型、控件资源名称和控件资源id;

12、将各控件资源对应的模块命名空间、控件资源类型和控件资源名称进行组合,得到各控件资源对应的资源检索标识;

13、对各资源检索标识进行哈希处理,得到各资源检索标识对应的映射存储位置;

14、按照各映射存储位置,将各资源检索标识与对应的控件资源id进行关联存储,得到各工程模块对应的资源映射信息,以使不同工程模块中具有相同控件资源名称的控件资源对应于不同的资源检索标识。

15、上述方案中,可选地,还包括:

16、获取所述目标android工程的资源变更信息,并根据所述资源变更信息确定发生新增、修改或删除的目标控件资源,得到资源变更集合;

17、根据所述资源变更集合中各目标控件资源对应的模块命名空间,从各工程模块对应的资源映射信息中确定待更新的资源映射条目;

18、根据各目标控件资源对应的变更类型,对所述待更新的资源映射条目执行新增、替换或删除操作,得到更新后的资源映射条目;

19、将所述更新后的资源映射条目写入对应工程模块的资源映射信息,得到增量更新后的资源映射信息。

20、上述方案中,可选地,所述针对所述编译期绑定类型的待绑定字段生成对应的编译期绑定代码,并建立所述目标类与对应的编译期绑定代码及资源映射信息之间的关联关系,包括:

21、解析所述编译期绑定类型对应的控件绑定标记,得到对应待绑定字段的字段标识、字段类型和控件资源信息;

22、根据所述字段标识、所述字段类型和所述控件资源信息,生成用于从根视图中查找控件实例并将所述控件实例赋值给所述待绑定字段的字段绑定代码;

23、根据所述目标类的全限定类名和所述目标类所属工程模块的模块命名空间,确定所述目标类对应的绑定类标识,并基于各待绑定字段对应的字段绑定代码,生成所述目标类对应的编译期绑定类;

24、将所述目标类的全限定类名、所述模块命名空间、所述绑定类标识和对应的资源映射信息标识进行关联,生成所述目标类所属工程模块对应的模块绑定索引。

25、上述方案中,可选地,所述根据各待绑定字段的绑定类型执行对应的控件绑定处理,包括:

26、根据所述待绑定目标对象的类型信息,获取与所述目标类预先建立关联的字段绑定信息,所述字段绑定信息包括各待绑定字段的绑定类型和控件资源信息;

27、根据各待绑定字段的绑定类型,将各待绑定字段划分为编译期绑定字段集合和运行时绑定字段集合;

28、针对所述编译期绑定字段集合调用对应的编译期绑定代码,得到编译期字段绑定结果;

29、针对所述运行时绑定字段集合执行资源映射查询和控件实例查找,得到各运行时绑定字段对应的候选控件实例;

30、根据所述候选控件实例执行运行时字段赋值处理,得到运行时字段绑定结果,并将所述编译期字段绑定结果和所述运行时字段绑定结果进行汇总,得到所述待绑定目标对象对应的控件绑定结果。

31、上述方案中,可选地,所述针对所述运行时绑定字段集合执行资源映射查询和控件实例查找,得到各运行时绑定字段对应的候选控件实例,包括:

32、依次获取所述运行时绑定字段集合中各待绑定字段对应的控件资源名称和控件资源类型,并获取所述待绑定目标对象所属工程模块的模块命名空间;

33、将所述模块命名空间、所述控件资源类型和所述控件资源名称进行组合,得到各待绑定字段对应的资源查询标识;

34、利用所述资源查询标识查询对应工程模块的资源映射信息,得到各待绑定字段对应的控件资源id;

35、根据各控件资源id在所述根视图中查找对应的控件实例,得到各待绑定字段对应的候选控件实例。

36、上述方案中,可选地,所述根据所述候选控件实例执行运行时字段赋值处理,得到运行时字段绑定结果,包括:

37、判断各候选控件实例是否为空,得到各候选控件实例对应的空值校验结果;

38、针对所述空值校验结果表示不为空的候选控件实例,判断所述候选控件实例的实际类型是否属于预设可绑定控件类型集合,并判断所述候选控件实例的实际类型与对应待绑定字段的字段类型是否满足可赋值关系,得到类型校验结果;

39、针对所述类型校验结果表示校验通过的候选控件实例,开启对应待绑定字段的访问权限,并通过反射将所述候选控件实例赋值给对应待绑定字段,得到反射赋值结果;

40、针对所述反射赋值结果表示赋值成功的待绑定字段,以弱引用形式保存所述待绑定目标对象、所述待绑定字段和对应控件实例之间的绑定关联信息,得到绑定成功记录;

41、针对候选控件实例为空、类型校验未通过或反射赋值发生异常的待绑定字段,生成包含待绑定字段信息、控件资源信息和失败原因的绑定失败记录,终止当前待绑定字段的绑定处理,并继续处理下一待绑定字段,得到所述运行时字段绑定结果。

42、上述方案中,可选地,所述监测所述待绑定目标对象对应的页面或视图的生命周期状态,并在所述页面或视图进入销毁状态时,清空各已绑定字段中的控件实例引用,并释放绑定过程中保存的关联信息,包括:

43、根据所述待绑定目标对象的对象类型,确定所述待绑定目标对象对应的生命周期主体和目标销毁事件,所述生命周期主体包括activity对象对应的生命周期主体或fragment视图对应的生命周期主体;

44、根据所述生命周期主体注册生命周期监听器,并将所述生命周期监听器与所述绑定关联信息进行关联,得到生命周期绑定关系;

45、通过所述生命周期监听器获取所述生命周期主体产生的生命周期事件,并在所述生命周期事件与所述目标销毁事件相匹配时,根据所述生命周期绑定关系确定待解绑字段集合;

46、根据所述绑定关联信息获取所述待绑定目标对象,并清空所述待解绑字段集合中各待绑定字段的控件实例引用,删除各待绑定字段对应的绑定关联信息,得到所述待绑定目标对象对应的解绑结果。

47、上述方案中,可选地,所述响应于针对待绑定目标对象的控件绑定请求,获取所述待绑定目标对象对应的根视图,并根据各待绑定字段的绑定类型执行对应的控件绑定处理,包括:

48、获取所述待绑定目标对象的全限定类名和所述待绑定目标对象所属工程模块的模块命名空间,得到目标类标识和目标模块标识;

49、根据所述目标类标识和所述目标模块标识查询所述模块绑定索引,得到与所述待绑定目标对象对应的绑定类标识和资源映射信息标识;

50、根据所述绑定类标识加载对应的编译期绑定类,并根据所述资源映射信息标识加载对应工程模块的资源映射信息,得到所述待绑定目标对象对应的绑定执行信息;

51、根据所述根视图和所述绑定执行信息调用所述编译期绑定类,并利用所述资源映射信息处理所述运行时绑定类型的待绑定字段,得到所述待绑定目标对象对应的控件绑定结果。

52、第二方面,一种适配非final资源id的android控件混合绑定系统,所述系统包括:

53、绑定信息获取模块,用于获取目标android工程中各工程模块的资源编译结果以及目标类中各待绑定字段对应的控件绑定标记,根据所述控件绑定标记确定各待绑定字段的绑定类型和控件资源信息,所述绑定类型包括编译期绑定类型和运行时绑定类型,所述运行时绑定类型对应的控件资源信息包括控件资源名称;

54、编译处理模块,用于按照各工程模块的模块命名空间,将所述资源编译结果中的控件资源名称与控件资源id进行关联,分别生成各工程模块对应的、相互隔离的资源映射信息,针对所述编译期绑定类型的待绑定字段生成对应的编译期绑定代码,并建立所述目标类与对应的编译期绑定代码及资源映射信息之间的关联关系;

55、混合绑定模块,用于响应于针对待绑定目标对象的控件绑定请求,获取所述待绑定目标对象对应的根视图,所述待绑定目标对象为所述目标类的对象实例,并根据各待绑定字段的绑定类型执行对应的控件绑定处理;对于所述编译期绑定类型的待绑定字段,调用对应的编译期绑定代码,直接从所述根视图中查找对应的控件实例并将所述控件实例赋值给所述待绑定字段;对于所述运行时绑定类型的待绑定字段,根据所述待绑定目标对象所属的工程模块和对应的控件资源名称查询所述资源映射信息,得到对应的控件资源id,并根据所述控件资源id从所述根视图中查找对应的控件实例;

56、安全处理模块,用于对针对所述运行时绑定类型查找到的控件实例进行空值校验和字段类型匹配校验,在校验通过时通过反射将所述控件实例赋值给对应的待绑定字段,并在当前待绑定字段的反射赋值发生异常时,终止当前待绑定字段的绑定处理并继续处理其他待绑定字段;

57、生命周期管理模块,用于监测所述待绑定目标对象对应的页面或视图的生命周期状态,并在所述页面或视图进入销毁状态时,清空各已绑定字段中的控件实例引用,并释放绑定过程中保存的关联信息。

58、相比现有技术,本技术至少具有以下有益效果:

59、本技术基于对现有技术问题的进一步分析和研究,认识到现有技术在android控件实例化过程中,资源管理方式变化导致的控件关联兼容性不足、不同页面场景下处理效率与适应性难以兼顾、多模块工程中的控件关联容易相互影响以及异常控件和失效引用难以及时处理的问题,通过获取目标android工程中各工程模块的资源编译结果及目标类中各待绑定字段的控件绑定标记,确定各待绑定字段对应的编译期绑定类型或运行时绑定类型,并按照模块命名空间建立相互隔离的控件资源名称与控件资源id之间的资源映射信息,使运行时绑定类型的待绑定字段能够以控件资源名称查询对应的控件资源id,从而降低资源id不满足编译期常量要求对控件绑定造成的影响,并减少不同工程模块之间的资源关联相互干扰;在此基础上,针对编译期绑定类型的待绑定字段调用预先生成的编译期绑定代码直接完成控件查找与字段赋值,能够降低静态布局场景下的运行处理开销,针对运行时绑定类型的待绑定字段则利用资源映射信息查找控件实例并通过反射完成字段赋值,能够适应控件资源关系需要在运行阶段确定的页面场景,由此兼顾控件绑定的处理效率与场景适应性;同时,在反射赋值前执行空值校验和字段类型匹配校验,并在单个待绑定字段发生反射赋值异常时终止当前字段的绑定处理而继续处理其他字段,能够将异常影响限制在当前字段,避免局部绑定失败影响页面整体运行;进一步地,通过监测页面或视图的生命周期状态,在页面或视图销毁时清空已绑定字段中的控件实例引用并释放相关联信息,能够减少失效控件引用造成的内存占用,因此能够提高android控件绑定对资源管理方式变化和不同页面场景的兼容能力,降低多模块工程中的绑定干扰,并提升控件绑定过程的执行效率、异常容错能力及运行稳定性。