一种通过反射实现Android获取数据的方法及系统与流程
未命名
09-21
阅读:73
评论:0
一种通过反射实现android获取数据的方法及系统
技术领域
1.本发明涉及android移动端技术领域,具体地,涉及一种通过反射实现android获取数据的方法及系统。
背景技术:
2.现有技术中,基于android移动端获取数据的方式如下:在调用方activity中调用startactivityforresult(是向android系统回传请求的一个接口函数)方法,并传递一个intent对象和一个请求码,请求码用于在返回结果时区分不同的请求,可以是任意非负整数;系统此时会启动一个新的activity,该activity可以显示用户界面或执行某些任务,用户与新activity交互并完成相应的操作;当需要返回结果时,使用setresult函数设置结果代码和结果数据,再调用finish函数结束当前activity,系统会将结果数据和请求码返回给调用方activity;调用方activity再使用onactivityresult函数,在该函数中,可以根据请求码判断哪个请求返回的结果,并对结果进行处理,完成android对数据的获取。
3.但采用上述方法存在以下问题:1.使用startactivityforresult需要处理回调和结果处理等复杂逻辑,会增加代码复杂度;2.使用startactivityforresult只能处理activity之间的通信,对于其他组件或服务的通信,需要添加额外的处理逻辑;3.使用startactivityforresult时,需要进行回调和结果处理等逻辑,导致代码结构不清晰,影响程序的可维护性。
技术实现要素:
4.为解决现有关于android获取数据方法中存在代码复杂度高、灵活性低和可维护性差的问题,本发明提供了一种通过反射实现android获取数据的方法,所述方法包括以下步骤:s1.获取初始组件,在所述初始组件中建立一个用于对android系统生命周期进行欺骗的生命周期组件;s2.通过反射获取所述初始组件的注册表;s3.使用所述生命周期组件将生命周期置为创建状态,在所述创建状态下,使用所述注册表进行注册;s4.当所述注册表注册完成后,使用所述生命周期组件将生命周期置为开始和恢复状态,调用所述初始组件相应的启动函数启动目标组件;s5.设置协程等待函数,在所述协程等待函数中处理所述目标组件返回的数据得到结果数据,将所述结果数据返回至所述初始组件,结束流程。
5.步骤s1~s5中,反射机制是指组件或者程序在运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。对于android而言,很多组件(比如activity或者fragment等)都具备生命周期,以往都是通过这些组件的生命周期回调函数在相应的生命周期里做相应的操作,但这种模式会导致代码条理性很差,因此通过在初始组件中设置生
命周期组件,可以将与初始组件生命周期相关的逻辑迁移到生命周期组件中,通过对生命周期组件执行操作来响应初始组件生命周期状态的变化。本发明原理:本发明首先在初始组件中设置对android系统生命周期欺骗的生命周期组件,通过对生命周期组件执行操作来响应初始组件生命周期状态的变化,再通过反射去动态调用初始组件中的启动函数去启动目标组件,并通过携程等待函数处理返回数据,由于设置了生命周期组件,将初始组件生命周期相关的逻辑都迁移到该生命周期组件中,改善了以往代码条理性较差的问题,同时由于是基于反射动态调用启动函数,所以不需要结果回调和结果处理等逻辑,代码复杂度降低,代码结构也更清晰,同时还能实现在不同组件之间的通信(现有方法局限于activity之间通信),因此采用本发明来实现android获取数据,不仅简化了代码逻辑,还提高了程序的灵活性和可维护性。
6.进一步地,所述步骤s5还包括:获取所述结果数据的返回码,判断所述返回码是否为0,若是,所述初始组件对所述结果数据进行处理;若否,对所述结果数据进行拦截处理后返回至所述初始组件。
7.其中,判断返回码是否为0,如果是,则表明返回成功,所述初始组件对结果数据进行处理。当返回码不为0时,则表示数据返回失败,此时就需要对返回失败的数据进行拦截处理后再返回至初始组件。
8.进一步地,对所述结果数据进行拦截处理包括,拦截并获取所述结果数据的错误码,对所述错误码进行解析处理得到对应的异常结果,将所述异常结果返回至所述初始组件。
9.其中,当结果数据返回失败时,一般会显示组件崩溃或者出现相应的错误码,用户再去基于错误码去查询结果数据返回失败的原因,步骤繁琐。为了提高用户体验,让用户能直接了解组件崩溃或者数据返回失败的原因,则对返回失败的结果数据进行拦截获取其相应的错误码,对错误码进行解析出来得到对应结果,再将该结果返回至初始组件。
10.进一步地,步骤s5还包括:对所述目标组件返回的数据进行验证和过滤后,在所述协程等待函数中进行处理。
11.其中,通过反射获取注册表字段可以直接获取目标组件的返回数据,但也存在被攻击者恶意利用而造成的安全风险问题,从而导致组件的安全性受到威胁,因此在获取目标组件返回的数据时,先进行验证和过滤,然后再传回至协程等待函数中进行处理。
12.进一步地,在步骤s1到步骤s5的每个步骤中,所述方法还包括对所述初始组件的生命周期进行管理:监听所述初始组件的状态,获取所述状态下所述初始组件对应的生命周期函数,在所述生命周期组件中,利用所述生命周期函数对所述初始组件的生命周期进行管理。
13.其中,通过反射获取注册表字段可以更加灵活地控制组件的生命周期,但同时也带来了生命周期管理的挑战,需要考虑组件的状态转换和内存管理等问题,因此通过生命周期组件对初始组件的生命周期进行管理。
14.进一步地,所述生命周期组件采用弱引用或者静态内部类的方式对所述初始组件的生命周期进行管理。
15.其中,在生命周期组件中,使用生命周期函数对初始组件的生命周期进行管理,由于初始组件每个阶段的生命周期长短都不相同,生命周期长的对象会持有短生命周期对象
的引用,尽管短生命周期的对象不再使用,但是因为长生命周期对象持有它的引用而导致不能被回收,从而造成内存泄露,因此通过采用弱引用或者静态内部类的方式进行解决。
16.进一步地,步骤s5还包括:判断所述初始组件是否被销毁,若是,则在所述生命周期组件的预设函数中进行释放资源操作,若否,则不做操作。
17.其中,当初始组件被销毁时,需要在生命周期组件中的预设函数ondestroy中手动释放资源和取消监听器等操作,以避免内存泄露。
18.进一步地,步骤s5还包括:当监测到所述初始组件被销毁且判断出在所述生命周期组件的预设函数中已经进行释放资源操作时,对所述生命周期组件进行销毁处理。
19.其中,由于定义的生命周期组件可能会在初始组件的生命周期外执行一些操作,因此需要注意初始组件的状态转换,当初始组件被销毁且已经进行释放资源等操作时,需要对生命周期组件执行销毁处理,避免在初始组件被销毁后继续执行操作,造成内存泄露。
20.进一步地,在步骤s1之前,所述方法还包括:获取android的版本,判断所述版本是否大于预设版本,若是,则执行步骤s1;若否,则对android的版本进行更新后,执行步骤s1。
21.其中,由于在高版本和低版本的android中,注册表的字段名和类型可能会不同,然后导致反射操作失败,为了确保反射操作成功,需要保障android版本达到11级以上。如果android版本已经大于android11了,则直接执行步骤s1;如果android版本小于等于android11,则需要先对android的版本进行更新,然后再执行步骤s1。
22.为解决现有关于android获取数据方法中存在代码复杂度高、灵活性低和可维护性差的问题,本发明还提供了一种通过反射实现android获取数据的系统,所述系统包括:第一获取单元,用于获取初始组件,在所述初始组件中建立一个用于对android系统生命周期进行欺骗的生命周期组件;第二获取单元,用于通过反射获取所述初始组件的注册表;注册单元,用于使用所述生命周期组件将生命周期置为创建状态,在所述创建状态下,使用所述注册表进行注册;启动单元,用于当所述注册表注册完成后,使用所述生命周期组件将生命周期置为开始和恢复状态,调用所述初始组件相应的启动函数启动目标组件;处理单元,用于设置协程等待函数,在所述协程等待函数中处理所述目标组件返回的数据得到结果数据,将所述结果数据返回至所述初始组件,结束流程。
23.本发明提供的一个或多个技术方案,至少具有如下技术效果或优点:本发明通过设置生命周期组件和基于反射机制去动态调用初始组件中的启动函数去启动目标组件,并通过协程等待函数处理返回数据,不仅简化了代码逻辑,还提高了程序的灵活性、条理性和可维护性。
附图说明
24.此处所说明的附图用来提供对本发明实施例的进一步理解,构成本发明的一部分,并不构成对本发明实施例的限定;图1是本发明中一种通过反射实现android获取数据的方法流程示意图;图2是本发明中一种通过反射实现android获取数据的系统组成示意图。
具体实施方式
25.为了能够更清楚地理解本发明的上述目的、特征和优点,下面结合附图和具体实施方式对本发明进行进一步的详细描述。需要说明的是,在相互不冲突的情况下,本发明的实施例及实施例中的特征可以相互组合。
26.在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是,本发明还可以采用其他不同于在此描述范围内的其他方式来实施,因此,本发明的保护范围并不受下面公开的具体实施例的限制。
27.实施例1;
28.请参考图1,为本发明中一种通过反射实现android获取数据的方法流程示意图,所述方法包括以下步骤:s1.获取初始组件,在所述初始组件中建立一个用于对android系统生命周期进行欺骗的生命周期组件;s2.通过反射获取所述初始组件的注册表;s3.使用所述生命周期组件将生命周期置为创建状态,在所述创建状态下,使用所述注册表进行注册;s4.当所述注册表注册完成后,使用所述生命周期组件将生命周期置为开始和恢复状态,再调用所述初始组件相应的启动函数去启动目标组件;s5.设置协程等待函数,在所述协程等待函数中处理所述目标组件返回的数据得到结果数据,将所述结果数据返回至所述初始组件,结束流程。
29.其中,反射机制指的是组件运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法,对于给定的一个对象,都能够调用它的任意一个属性和方法,这种动态获取类的内容以及动态调用对象的方法称为反射。
30.在本发明实施例中,获取初始组件(activity),在初始组件中建立用于对android系统生命周期进行欺骗的生命周期组件(如lifecycleowner),通过反射获取初始组件的注册表(mactivityresultrsgistry字段),该字段中存储了初始组件中所有的activityresultlauncher(启动器),这时候使用生命周期组件将生命周期状态置为创建状态(created),在该状态下,使用注册表进行注册,注册完成后,使用生命周期组件将生命周期状态置为开始(started)和恢复(resumed)状态,再去调用启动器中的launch方法(启动函数)启动目标组件,并设置协程等待函数处理目标组件返回的数据,从而实现android对数据的获取和处理。
31.进一步地,判断初始组件与目标组件之间是否存在多级组件,当判断出初始组件与目标组件之间存在多级组件,如果采用传递intent对象和利用请求码及结果码来处理返回结果,会进一步增加代码的复杂度和维护难度,因此采用本方案中的步骤s1至步骤s4去依次启动每一级组件直到启动目标组件,最后设置协程等待函数,在所述协程等待函数中处理所述目标组件返回的数据得到结果数据,将所述结果数据返回至所述初始组件,最后结束流程。针对多级组件的启动采用本方案来执行,能进一步简化代码逻辑,进一步提高程序的灵活性、条理性和可维护性。
32.其中,所述步骤s5还包括:获取所述结果数据的返回码,判断所述返回码是否为0,若是,所述初始组件对所述结果数据进行处理;若否,对所述结果数据进行拦截处理后返回
至所述初始组件。
33.判断返回码是否为0,如果为0,则说明结果数据返回成功,此时所述初始组件对所述结果数据进行处理。如果返回码不为0,则说明结果数据返回不成功,这是就需要对结果数据进行拦截并处理后再返回至初始组件。
34.其中,对所述结果数据进行拦截处理包括,拦截并获取所述结果数据的错误码,对所述错误码进行解析处理得到对应的异常结果,将所述异常结果返回至所述初始组件。
35.当结果数据返回异常时,大多都是返回错误码或者组件直接崩溃,用户需要根据错误码去查询结果返回失败的原因,步骤繁琐,同时对于缺乏相关知识的人来说,也不知道如何去查询,因此为了提高用户体验,让用户能直接了解组件崩溃或者数据返回失败的原因,则对返回失败的结果数据进行拦截获取其相应的错误码,对错误码进行解析出来得到对应结果,再将该结果返回至初始组件。
36.其中,步骤s5还包括:对所述目标组件返回的数据进行验证和过滤后,在所述协程等待函数中进行处理。
37.通过反射获取注册表字段可以直接获取目标组件的返回数据,但也存在被攻击者恶意利用而造成的安全风险问题,从而导致组件的安全性受到威胁,因此在获取目标组件返回的数据时,先进行验证和过滤,然后再传回至协程等待函数中进行处理。
38.其中,在步骤s1到步骤s5的每个步骤中,所述方法还包括对所述初始组件的生命周期进行管理:监听所述初始组件的状态,获取所述状态下所述初始组件对应的生命周期函数,在所述生命周期组件中,利用所述生命周期函数对所述初始组件的生命周期进行管理。
39.通过反射获取注册表字段可以更加灵活地控制组件的生命周期,但同时也带来了生命周期管理的挑战,需要考虑组件的状态转换和内存管理等问题,因此通过生命周期函数对初始组件生命周期进行管理,起到在初始组件生命周期各个阶段之前导航转换的效果。例如,良好的生命周期函数有助于防止组件或应用出现以下问题:当用户在使用应用时接听来电,或切换至另一应用时崩溃;当用户未主动使用程序时,消耗宝贵的系统资源;当用户离开应用并在稍后返回时,丢失用户的进度;当屏幕在横向和纵向之间旋转时,崩溃或者丢失用户的进度。
40.其中,所述生命周期组件采用弱引用或者静态内部类的方式对所述初始组件的生命周期进行管理。
41.在生命周期组件中,使用生命周期函数对初始组件的生命周期进行管理,由于初始组件每个阶段的生命周期长短都不相同,生命周期长的对象会持有短生命周期对象的引用,尽管短生命周期的对象不再使用,但是因为长生命周期对象持有它的引用而导致不能被回收,从而造成内存泄露,因此通过采用弱引用或者静态内部类的方式进行解决。采用弱引用能解决内存泄露原因是,当垃圾回收器扫描到只有具有弱引用的对象时,无论当前空间是否不足,都会对弱引用对象进行回收,从而防止出现内存泄露;采用静态内部类的方式解决内存泄露原因是,采用静态内部类后,就不再持有对外部类的隐式引用,当然就不会存在内存泄露的问题。
42.其中,步骤s5还包括:判断所述初始组件是否被销毁,若是,则在所述生命周期组件的预设函数中进行释放资源操作,若否,则不做操作。
43.当初始组件被销毁时,需要在生命周期组件中的预设函数ondestroy中手动释放资源和取消监听器等操作,以避免内存泄露。
44.其中,步骤s5还包括:当监测到所述初始组件被销毁且判断出在所述生命周期组件的预设函数中已经进行释放资源操作时,对所述生命周期组件进行销毁处理。
45.由于定义的生命周期组件可能会在初始组件的生命周期外执行一些操作,因此需要注意初始组件的状态转换,当初始组件被销毁且已经进行释放资源等操作时,需要对生命周期组件执行销毁处理,避免在初始组件被销毁后继续执行操作,造成内存泄露。其中,在步骤s1之前,获取android的版本,判断所述版本是否大于预设版本,若是,则执行步骤s1;若否,则对android的版本进行更新后,执行步骤s1。
46.由于在高版本和低版本的android中,注册表的字段名和类型可能会不同,然后导致反射操作失败,为了确保反射操作成功,需要保障android版本达到11级以上。如果android版本已经大于android11了,则直接执行步骤s1;如果android版本小于等于android11,则需要先对android的版本进行更新,然后再执行步骤s1。上述对android版本的判定是为了保障反射能操作成功,也可以通过在反射获取对象时catch捕获是否能获取到对象,若能,则继续执行步骤s1,若不能,则也需要对android的版本进行更新后,再执行步骤s1。
47.实施例2;
48.请参考图2,为本发明中一种通过反射实现android获取数据的系统组成示意图,所述系统包括:第一获取单元,用于获取初始组件,在所述初始组件中建立一个用于对android系统生命周期进行欺骗的生命周期组件;第二获取单元,用于通过反射获取所述初始组件的注册表;注册单元,用于使用所述生命周期组件将生命周期置为创建状态,在所述创建状态下,使用所述注册表进行注册;启动单元,用于当所述注册表注册完成后,使用所述生命周期组件将生命周期置为开始和恢复状态,调用所述初始组件相应的启动函数启动目标组件;处理单元,用于设置协程等待函数,在所述协程等待函数中处理所述目标组件返回的数据得到结果数据,将所述结果数据返回至所述初始组件,结束流程。尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
49.显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
技术特征:
1.一种通过反射实现android获取数据的方法,其特征在于,所述方法包括以下步骤:s1.获取初始组件,在所述初始组件中建立一个用于对android系统生命周期进行欺骗的生命周期组件;s2.通过反射获取所述初始组件的注册表;s3.使用所述生命周期组件将生命周期置为创建状态,在所述创建状态下,使用所述注册表进行注册;s4.当所述注册表注册完成后,使用所述生命周期组件将生命周期置为开始和恢复状态,调用所述初始组件相应的启动函数启动目标组件;s5.设置协程等待函数,在所述协程等待函数中处理所述目标组件返回的数据得到结果数据,将所述结果数据返回至所述初始组件,结束流程。2.根据权利要求1所述的一种通过反射实现android获取数据的方法,其特征在于,所述步骤s5还包括,获取所述结果数据的返回码,判断所述返回码是否为0,若是,所述初始组件对所述结果数据进行处理;若否,对所述结果数据进行拦截处理后返回至所述初始组件。3.根据权利要求2所述的一种通过反射实现android获取数据的方法,其特征在于,对所述结果数据进行拦截处理包括:拦截并获取所述结果数据的错误码,对所述错误码进行解析处理得到对应的异常结果,将所述异常结果返回至所述初始组件。4.根据权利要求1所述的一种通过反射实现android获取数据的方法,其特征在于,步骤s5还包括:对所述目标组件返回的数据进行验证和过滤后,在所述协程等待函数中进行处理。5.根据权利要求1所述的一种通过反射实现android获取数据的方法,其特征在于,在步骤s1到步骤s5的每个步骤中,所述方法还包括对所述初始组件的生命周期进行管理:监听所述初始组件的状态,获取所述状态下所述初始组件对应的生命周期函数,在所述生命周期组件中,利用所述生命周期函数对所述初始组件的生命周期进行管理。6.根据权利要求1所述的一种通过反射实现android获取数据的方法,其特征在于,所述生命周期组件采用弱引用或者静态内部类的方式对所述初始组件的生命周期进行管理。7.根据权利要求1所述的一种通过反射实现android获取数据的方法,其特征在于,步骤s5还包括:判断所述初始组件是否被销毁,若是,则在所述生命周期组件的预设函数中进行释放资源操作,若否,则不做操作。8.根据权利要求7所述的一种通过反射实现android获取数据的方法,其特征在于,步骤s5还包括:当监测到所述初始组件被销毁且判断出在所述生命周期组件的预设函数中已经进行释放资源操作时,对所述生命周期组件进行销毁处理。9.根据权利要求1所述一种通过反射实现android获取数据的方法,其特征在于,在步骤s1之前,所述方法还包括:获取android的版本,判断所述版本是否大于预设版本,若是,则执行步骤s1;若否,则对android的版本进行更新后,执行步骤s1。10.一种通过反射实现android获取数据的系统,其特征在于,所述系统包括:第一获取单元,用于获取初始组件,在所述初始组件中建立一个用于对android系统生命周期进行欺骗的生命周期组件;第二获取单元,用于通过反射获取所述初始组件的注册表;注册单元,用于使用所述生命周期组件将生命周期置为创建状态,在所述创建状态下,
使用所述注册表进行注册;启动单元,用于当所述注册表注册完成后,使用所述生命周期组件将生命周期置为开始和恢复状态,调用所述初始组件相应的启动函数启动目标组件;处理单元,用于设置协程等待函数,在所述协程等待函数中处理所述目标组件返回的数据得到结果数据,将所述结果数据返回至所述初始组件,结束流程。
技术总结
本发明公开了一种通过反射实现Android获取数据的方法及系统,涉及Android移动端技术领域,该方法包括:S1.获取初始组件,在初始组件中建立一个用于对Android系统生命周期进行欺骗的生命周期组件;S2.通过反射获取初始组件的注册表;S3.使用生命周期组件将生命周期置为创建状态,在创建状态下,使用注册表进行注册;S4.当注册表注册完成后,使用生命周期组件将生命周期置为开始和恢复状态,调用初始组件相应的启动函数启动目标组件;S5.设置协程等待函数,在协程等待函数中处理返回数据得到结果数据,将结果数据返回至初始组件,结束流程。发明通过设置生命周期组件和基于反射去实现Android获取数据,不仅简化了代码逻辑,还提高了程序的灵活性和可维护性。高了程序的灵活性和可维护性。高了程序的灵活性和可维护性。
技术研发人员:沈洋 钱刚 吴涛 王洪兴 胡琳璘 王兵 付强 杜琦
受保护的技术使用者:成都太阳高科技有限责任公司
技术研发日:2023.08.25
技术公布日:2023/9/20
版权声明
本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
飞行汽车 https://www.autovtol.com/
