一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于对象快照的应用透明的自由缩放容错方法与流程

2023-01-02 18:39:58 来源:中国专利 TAG:

1.本发明属于移动应用开发技术领域,具体涉及一种基于对象快照的应用透明的自由缩放容错方法。


背景技术:

2.当在桌面平台上运行安卓应用时,根据用户使用桌面系统的习惯往往会产生缩放安卓应用窗口的需求。现有技术中通常采用在桌面平台上安装安卓运行环境的方式运行安卓应用,典型的安卓兼容环境主要包括安卓应用显示单元和安卓应用兼容服务,安卓应用显示单元用于在桌面操作系统上实现安卓应用的用户界面,安卓应用兼容服务用于提供运行于桌面操作系统上的安卓兼容环境,通过安卓应用显示单元与安卓应用兼容服务的相互配合实现安卓应用在桌面操作系统上的有效运行,例如,现有安卓兼容环境的实现方案有xdroid,它包括xdroidui和xdroidserver,xdroidui为安卓应用显示单元,xdroidserver为安卓应用兼容服务。
3.在现有的安卓系统中,当安卓应用窗口发生变化时,例如,安卓应用窗口的大小、显示文字的字体或键盘等改变,安卓系统框架层的activitymanager会触发acitivtyconfigurationchanged消息,并尝试重新启动应用相关的所有活动activity。一般情况下,安卓应用窗口是由安卓系统实现并控制的,安卓应用的activity则是由安卓应用本身实现的。如果在安卓应用开发过程中未考虑重启activity时的适应性调整操作,就可能产生调整安卓应用窗口大小导致activity崩溃的问题,并且安卓应用的使用模式决定了大多数的应用开发者并未考虑此类问题,因此为安卓应用在桌面系统的使用带来了困难。


技术实现要素:

4.有鉴于此,本发明提供了一种基于对象快照的应用透明的自由缩放容错方法,能够保证在安卓应用窗口自由缩放时安卓应用功能的稳定性及可靠性。
5.本发明提供的一种基于对象快照的应用透明的自由缩放容错方法,具体包括以下步骤:步骤1、当桌面系统内产生安卓应用桌面窗口相关的缩放事件时,安卓应用显示单元向安卓兼容环境发送包含改变后的安卓应用窗口大小的安卓应用窗口缩放事件消息;步骤2、安卓兼容环境接收到安卓应用显示单元发送的安卓应用窗口缩放事件消息后,根据安卓应用窗口缩放事件消息重新设置安卓应用的窗口大小后,为安卓应用的所有activity创建活动快照,活动快照中保存activity的所有属性;获取每个activity所在的activitystack,若activitystack所保存的activity数量大于1,则将当前安卓应用相关的activity从activitystack中移出,并记录activity在activitystack中的位置为activity索引位置;步骤3、安卓兼容环境执行重启所有activity的操作,如果执行过程产生异常,则
在捕获异常后分析异常调用栈,若异常调用栈中存在与activity重启相关的函数则执行步骤4,否则执行步骤5;如果执行过程未产生异常,则执行步骤6;步骤4、采用步骤2中创建的活动快照保存的属性重新设置对应的activity,再采用步骤2中重新设置的安卓应用的窗口大小对安卓应用窗口执行重布局操作,并不再向上抛出异常完成安卓系统后续操作的执行;若activity索引位置为空则执行步骤7,否则将activity按照activity索引位置插入activitystack后执行步骤7;步骤5、采用步骤2中创建的活动快照保存的属性重新设置对应的activity,再采用当前activity操作相关的线程执行安卓应用对应窗口的所有activity的重新启动操作,并不再向上抛出异常完成安卓系统后续操作的执行;若activity索引位置为空则执行步骤7,否则将activity按照activity索引位置插入activitystack后执行步骤7;步骤6、若activity索引位置为空则执行步骤7,否则将activity按照activity索引位置插入activitystack后执行步骤7;步骤7、安卓兼容环境向安卓应用显示单元发送activity重新启动完毕消息;安卓应用显示单元接收到activity重新启动完毕消息后,执行后续正常操作。
6.进一步地,所述步骤1中所述当桌面系统内产生安卓应用桌面窗口相关的缩放事件时,安卓应用显示单元采用保存的当前安卓应用桌面窗口的大小、截图及位置创建遮挡子窗口,并当安卓应用桌面窗口缩放时,对遮挡子窗口进行等比例缩放。
7.进一步地,所述遮挡子窗口为image类型的qt子窗口。
8.进一步地,所述创建遮挡子窗口后隐藏安卓应用桌面窗口内子窗口的显示。
9.进一步地,所述步骤7中所述安卓应用显示单元接收到activity重新启动完毕消息后销毁所述遮挡子窗口。
10.进一步地,所述步骤2中所述活动快照中保存activity的所有属性的方式为:在获取安卓应用activity的属性后,判断属性的数据类型,若数据类型为pod则直接将activity的属性值赋值给活动快照;若数据类型为非pod,则判断数据类型是否为java对象,如果是则将java对象的引用赋值给活动快照,如果不是则将属性值赋值给活动快照。
11.进一步地,所述将属性值赋值给活动快照的方式为通过调用赋值函数将属性值赋值给活动快照。
12.有益效果:本发明通过在安卓兼容环境内为改变大小的activity创建活动快照,在安卓兼容环境重启activity的操作之前对activitystack进行保护,以及在重启activity的操作中捕获异常并根据异常特征确定异常的响应方式,能够在不修改安卓应用代码的前提下处理由安卓应用改变大小所导致的异常,实现对activity崩溃的系统级容错。
具体实施方式
13.下面列举实施例,对本发明进行详细描述。
14.本发明提供的一种基于对象快照的应用透明的自由缩放容错方法,具体包括以下步骤:步骤1、当桌面系统内产生安卓应用桌面窗口相关的缩放事件时,安卓应用显示单元向安卓兼容环境发送包含改变后的安卓应用窗口大小的安卓应用窗口缩放事件消息。
15.其中,安卓应用桌面窗口为安卓应用在桌面系统中由安卓应用显示单元生成的应用窗口。本发明中安卓应用显示单元可通过rpc机制向安卓兼容环境发送安卓应用窗口缩放事件消息。
16.安卓应用桌面窗口缩放过程可能会导致安卓系统产生异常,若不处理异常则安卓应用将会退出,若处理异常则可能导致安卓应用桌面窗口出现黑屏闪烁现象,因此,为了进一步改善用户体验,本发明在处理异常的同时通过创建与安卓应用桌面窗口相同的临时窗口,采用临时窗口在安卓应用桌面窗口缩放过程中对其进行遮挡,以对用户屏蔽可能产生的黑屏闪烁情况。
17.具体来说,在产生安卓应用桌面窗口相关的缩放事件时,安卓应用显示单元保存当前安卓应用桌面窗口(也就是缩放前的安卓应用桌面窗口)的大小、截图及位置,采用保存的大小、截图及位置创建遮挡子窗口,使其与安卓应用桌面窗口具有相同的可视化效果;当安卓应用桌面窗口缩放时,对遮挡子窗口进行等比例缩放,以实现对缩放后的安卓应用桌面窗口的持续遮挡。
18.此外,为了提升安卓兼容环境的运行性能,当创建遮挡子窗口后隐藏安卓应用桌面窗口内的子窗口的显示,以减少安卓兼容环境内安卓应用相关的刷新操作。
19.步骤2、安卓兼容环境接收到安卓应用显示单元发送的安卓应用窗口缩放事件消息后,根据安卓应用窗口缩放事件消息重新设置安卓应用的窗口大小后,为安卓应用的所有activity创建活动快照,活动快照中保存activity的所有属性;获取每个activity所在的activitystack,若activitystack所保存的activity数量大于1,则将当前安卓应用相关的activity从activitystack中移出,并记录activity在activitystack中的位置为activity索引位置。
20.其中,为安卓应用的所有activity创建活动快照的过程可利用反射机制获取activity对应的类,再创建该类的实例。
21.此外,为了进一步提高本发明的适应性,本发明在获取安卓应用activity的属性后,判断属性的数据类型,若数据类型为pod(plain old data)则直接将activity的属性值赋值给活动快照;若数据类型为非pod,则进一步判断数据类型是否为window或view等java对象,如果是则将java对象的引用赋值给活动快照,以防止发生异常时activity被释放,如果不是则将属性值赋值给活动快照。本发明中可通过调用赋值函数将属性值赋值给活动快照。
22.步骤3、安卓兼容环境执行重启所有activity的操作,如果执行过程产生异常,则在捕获异常后分析异常调用栈,若异常调用栈中存在与activity重启相关的函数则执行步骤4,否则执行步骤5;如果执行过程未产生异常,则执行步骤6。
23.步骤4、采用步骤2中创建的活动快照保存的属性重新设置对应的activity,再采用步骤2中重新设置的安卓应用的窗口大小对安卓应用窗口执行重布局操作,并不再向上抛出异常完成安卓系统后续操作的执行;若activity索引位置为空则执行步骤7,否则将activity按照activity索引位置插入activitystack后执行步骤7。
24.步骤5、采用步骤2中创建的活动快照保存的属性重新设置对应的activity,再采用当前activity操作相关的线程执行安卓应用对应窗口的所有activity的重新启动操作,并不再向上抛出异常完成安卓系统后续操作的执行;若activity索引位置为空则执行步骤
7,否则将activity按照activity索引位置插入activitystack后执行步骤7。
25.步骤6、若activity索引位置为空则执行步骤7,否则将activity按照activity索引位置插入activitystack执行步骤7。
26.步骤7、安卓兼容环境向安卓应用显示单元发送activity重新启动完毕消息;安卓应用显示单元接收到activity重新启动完毕消息后,执行后续正常操作。
27.若安卓应用显示单元创建了与安卓应用桌面窗口相同的遮挡子窗口,则在接收到activity重新启动完毕消息后销毁遮挡子窗口,以显示安卓应用桌面窗口。
28.实施例:本实施例采用本发明提供的一种基于对象快照的应用透明的自由缩放容错方法,在xdroid中实现了具有容错机制的安卓应用自由缩放的功能,具体包括以下步骤:s1、当xdroidui检测到与安卓应用的linux窗口相关的resize事件后,执行以下操作:s1.1、创建类型为image的qt子窗口,该qt子窗口显示的图像即为缩放之前的安卓应用linux窗口的截图,同时隐藏显示安卓应用的子窗口,且根据缩放后的大小对qt子窗口进行等比缩放。
29.s1.2、通过rpc机制向安卓应用兼容服务发送安卓应用桌面窗口缩放事件。
30.s2、安卓兼容环境接收到安卓应用显示单元发送的安卓应用窗口缩放事件消息后,根据安卓应用窗口缩放事件消息重新设置安卓应用的所有窗口的大小后,为安卓应用的所有activity创建活动快照,活动快照中保存activity的所有属性。
31.具体过程为,修改安卓兼容环境内的activitymanager和activitystack中acitivtyconfigurationchanged的相关处理流程,包括:对于每个被重置大小的activity,在对其执行relaunchactivity之前,创建该activity的活动快照,创建活动快照的方式为利用反射机制获取并调用activity的getclass()方法获取其对应的类,再创建该类的一个实例记为activityclone;再利用反射机制获取activity的所有属性,若属性的数据类型为pod则直接将属性值赋值给activityclone对应的属性,若属性的数据类型不是pod而是window或view等java对象则将java对象的引用赋值给activityclone对应的属性,若属性的数据类型既不是pod也不是java对象则直接调用赋值函数,如等号运算符等,将属性值赋值给activityclone对应的属性。
32.s3、若安卓兼容环境对应的安卓系统版本号小于9,即说明系统设定了多个activity属于同一activitystack,此时则将activity从其所在的activitystack中移出,以防止该activity可能产生的异常对activitystack内其他activity造成影响,导致异常难以处理,系统难以恢复,同时记录activity在activitystack中的索引位置记为indexinstack;若安卓兼容环境对应的安卓系统版本号不小于9,则不做处理。
33.s4、在relaunchactivity的相关函数调用的代码中引入try-catch异常处理机制捕获relaunchactivity处理过程中的所有异常,即采用try-catch异常捕获代码块将relaunchactivity的相关操作保护起来。relaunchactivity的相关函数调用如relaunchactivitylocked等。
34.s5、若relaunchactivity处理过程中产生异常,则在捕获异常后判断异常调用栈
上是否存在activitythread.handlerelaunchactivity函数等相关函数,若存在则将activityclone的相关属性赋值回activity,即将activity恢复到异常发生之前的状态,再使用新的windowsize对activity对应的window的decorview进行relayout操作,且不继续向上抛出异常即正常执行后续的操作;若不存在则将activityclone的相关属性赋值回activity,即将activity恢复到异常发生之前的状态,再调用当前activity所在线程的handlerelaunchactivity方法,例如通过调用getactivitythread方法获取当前activity所在线程,handlerelaunchactivity方法中会执行对activity对应的window的decorview的relayout操作,且不继续向上抛出异常即正常执行后续的操作。
35.s6、若安卓兼容环境对应的安卓系统版本号小于9,则将activity按照indexinstack的位置插回到activitystack中,并在relaunchactivity处理完毕后,通过rpc机制向xdroidui发送activity重新启动完毕消息。
36.s7、当xdroidui收到activity重新启动完毕消息后,销毁qt子窗口,并恢复安卓应用桌面窗口内子窗口的显示。
37.综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献