基于延时注册的应用启动方法、装置和存储介质与流程

文档序号:17488609发布日期:2019-04-23 20:12阅读:131来源:国知局
基于延时注册的应用启动方法、装置和存储介质与流程

本发明实施例涉及计算机技术,尤其涉及一种基于延时注册的应用启动方法、装置和存储介质。



背景技术:

随着手机、平板电脑等终端的不断发展,终端上安装的应用程序(application,app)越来越多,用户对应用程序的需求也越来越多。为了满足用户的需求,应用程序的版本逐步升级,相应的启动项也逐渐增多,在同时启动这些启动项时,会大大降低应用程序的启动速度,影响用户体验。

目前,基于android系统的应用程序在启动时,往往可以通过减少启动项的方式来提高应用程序的启动速度。然而,在实际应用中大部分的启动项是必须启动的,无法被去掉。可见,现有应用启动的方式并不能有效地解决应用程序启动慢的问题。



技术实现要素:

本发明实施例提供了一种基于延时注册的应用启动方法、装置和存储介质,以提高应用程序的启动速度,从而提升用户体验。

第一方面,本发明实施例提供了一种基于延时注册的应用启动方法,包括:

获取应用程序的多个启动对象以及每个所述启动对象对应的类名、启动函数名称、优先级信息和权重信息,其中所述优先级信息和所述权重信息均为枚举类型的;

以所述类名、所述启动函数名称、所述优先级信息和所述权重信息为函数输入参数,调用所述启动对象中的延时注册函数,确定每个所述启动对象对应的延迟时间,并对每个所述启动对象存储的启动函数进行注册,获得注册后的第一类名集合对象、第一函数名称集合对象和第一延迟时间集合对象;

根据所述第一类名集合对象、所述第一函数名称集合对象和所述第一延迟时间集合对象,对所述启动对象进行调度和加载。

第二方面,本发明实施例还提供了一种基于延时注册的应用启动装置,包括:

启动对象获取模块,用于获取应用程序的多个启动对象以及每个所述启动对象对应的类名、启动函数名称、优先级信息和权重信息,其中所述优先级信息和所述权重信息均为枚举类型的;

延时注册模块,用于以所述类名、所述启动函数名称、所述优先级信息和所述权重信息为函数输入参数,调用所述启动对象中的延时注册函数,确定每个所述启动对象对应的延迟时间,并对每个所述启动对象存储的启动函数进行注册,获得注册后的第一类名集合对象、第一函数名称集合对象和第一延迟时间集合对象;

启动对象调度加载模块,用于根据所述第一类名集合对象、所述第一函数名称集合对象和所述第一延迟时间集合对象,对所述启动对象进行调度和加载。

第三方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本发明任意实施例所提供的基于延时注册的应用启动方法。

本发明实施例通过获取启动应用程序时需要加载的多个启动对象,并利用延时注册函数,基于启动对象对应的枚举类型的优先级信息和权重信息动态计算启动对象对应的延迟时间,以避免直接传入延迟时间而存在的重复性情况,并对每个启动对象存储的启动函数进行统一的延时注册,从而可以根据第一延迟时间集合对象中延迟时间的先后顺序,对每个启动对象进行自动调度和动态加载,以避免在启动应用程序时同时加载所有启动对象的情况,从而提高了应用程序的启动速度,以及提升了用户体验。

附图说明

图1是本发明实施例一提供的一种基于延时注册的应用启动方法的流程图;

图2是本发明实施例二提供的一种基于延时注册的应用启动方法的流程图;

图3是本发明实施例三提供的一种基于延时注册的应用启动方法的流程图;

图4是本发明实施例四提供的一种基于延时注册的应用启动装置的结构示意图。

具体实施方式

下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。

实施例一

图1为本发明实施例一提供的一种基于延时注册的应用启动方法的流程图,本实施例可适用于启动基于android系统的应用程序的情况。该方法可以由基于延时注册的应用启动装置来执行,该装置可以由软件和/或硬件的方式来实现,集成于安装有应用程序的智能终端中,比如智能手机、平板电脑或掌上游戏机等。如图1所示,该方法具体包括以下步骤:

s110、获取应用程序的多个启动对象以及每个启动对象对应的类名、启动函数名称、优先级信息和权重信息。

其中,启动对象可以是在启动应用程序时所需要启动的任务或功能模块等。启动对象对应的类名是指启动对象所属的类的名称。启动函数是指在启动应用程序过程中,需要进行延迟启动的初始化函数。本实施例中的启动对象可以是用于存储启动函数的对象。启动对象对应的启动函数名称是指启动对象中存储的启动函数的函数名称。启动对象对应的优先级信息可以根据在启动应用程序过程中启动对象的重要程度预先确定,比如启动对象的重要程度越高,则对应的优先级越高。启动对象对应的优先级信息可以用于表征启动对象在启动时的先后顺序,即启动对象的优先级越高,则越优先进行启动。启动对象对应的权重信息也可以根据启动对象的重要程度预先确定,比如启动对象的重要程度越高,则对应的权重越大。本实施例通过设置权重信息,可以确定在优先级信息相同的情况下,启动对象的先后启动顺序,以避免同时启动较多数量的启动对象的情况。例如,在优先级信息相同的情况下,启动对象对应的权重越大,则越优先进行启动。

具体地,本实施例中获取的类名classname可以是类class类型的信息,启动函数名称funcname可以是字符串string类型的信息。优先级信息mpriority和权重信息mweight均是枚举类型enum的信息。示例性地,某个启动对象对应的类名classname为:initmodule,对应的启动函数名称funcname为:initall,对应的优先级信息mpriority为:priority_1,对应的权重信息mweight为:weight_1。

需要注意的是,若将优先级信息和权重信息均设置为整数类型int的信息,则极易出现重复或者用户随意写个数字便可篡改优先级或权重的情况。本实施例通过将优先级信息和权重信息均设置为枚举类型的信息,可以有效防止用户提供无效值,避免出现重复或用户随意篡改的情况,从而保证了优先级和权重的唯一性。

s120、以类名、启动函数名称、优先级信息和权重信息为函数输入参数,调用启动对象中的延时注册函数,确定每个启动对象对应的延迟时间,并对每个启动对象存储的启动函数进行注册,获得注册后的第一类名集合对象、第一函数名称集合对象和第一延迟时间集合对象。

其中,延迟注册函数是预先定义的,用于确定启动对象对应的延迟时间,并对启动对象存储的启动函数进行延时注册的函数,以便在启动应用程序时可以延迟加载启动对象。延时注册函数具有公有权限修饰符public,以使每个启动对象可以直接调用该延迟注册函数。延迟时间是指在应用程序开始启动后,延迟加载该启动对象的时间。第一类名集合对象是预先定义的,用于存储每个启动对象对应的类名的集合list类型的对象。第一函数名称集合对象是预先定义的,用于存储每个启动对象对应的启动函数的集合list类型的对象。第一延迟时间集合对象是预先定义的,用于存储每个启动对象对应的延迟时间的集合list类型的对象。在定义第一类名集合对象、第一函数名称集合对象和第一延迟时间集合对象时,需要进行初始化的操作。

示例性地,延迟注册函数setdelayhandler可以定义为:

publicvoidsetdelayhandler(classclassname,stringfuncname,enummpriority,enummweight)

第一类名集合对象listclass可以定义为:

list<class>listclass=newarraylist<class>()

第一函数名称集合对象listfuncname可以定义为:

list<string>listfuncname=newarraylist<string>()

第一延迟时间集合对象listdelay可以定义为:

list<long>listdelay=newarraylist<long>()

具体地,将class类型的类名classname、string类型的启动函数名称funcname、enum类型的优先级信息mpriority和enum类型的和权重信息mweight作为setdelayhandler的输入参数,通过调用某个启动对象中的setdelayhandler,可以根据该启动对象对应的优先级信息mpriority和权重信息mweight确定该启动对象对应的延迟时间,并将该启动对象对应的classname添加至第一类名集合对象listclass中,将该启动对象对应的funcname添加至第一函数名称集合对象listfuncname中,以及将该启动对象对应的delay添加至第一延迟时间集合对象listdelay中,从而完成该启动对象的延迟注册操作。同理,通过调用每个启动对象中的延迟注册函数setdelayhandler,可以确定每个启动对象对应的延迟时间,并将每个启动对象对应的类名、启动函数名称和延迟时间分别添加至第一类名集合对象、第一函数名称集合对象和第一延迟时间集合对象中,从而可以获得每个启动对象注册后的第一类名集合对象、第一函数名称集合对象和第一延迟时间集合对象。

需要注意的是,本实施例中第一类名集合对象、第一函数名称集合对象和第一延迟时间集合对象中元素的排列顺序为元素的添加顺序,并且在第一类名集合对象、第一函数名称集合对象和第一延迟时间集合对象中,同一位置索引号对应的类名、启动函数名称和延迟时间均对应同一个启动对象。并且,本实施例中启动对象对应的延迟时间均是根据枚举类型的优先级信息和权重信息统一计算的,而不是用户直接传入的,从而可以避免存在较多延迟时间重复的情况,以便可以进行合理地调度和加载。

s130、根据第一类名集合对象、第一函数名称集合对象和第一延迟时间集合对象,对启动对象进行调度和加载。

具体地,可以根据第一延迟时间集合对象存储的各个延迟时间的先后顺序,对启动对象进行自动调度,并根据第一类名集合对象、第一函数名称集合对象获得每个延迟时间对应的类名和启动函数名称,从而可以对启动对象进行动态加载,即执行启动对象中的启动函数。通过对每个启动对象设置一定的延迟时间,并按照设置的延迟时间对启动对象进行加载,从而可以避免在启动应用程序时同时加载所有启动对象的情况。本实施例通过基于延迟时间逐次分批的加载启动对象,可以提高终端的运行效率,从而可以缩短应用程度的启动时间,提高启动速度,进而可以提升用户的观看体验。

示例性地,s130可以包括:对第一延迟时间集合对象中的各延迟时间进行升序排列,并将排列后的第一延迟时间集合对象确定为第二延迟时间集合对象;根据第一延迟时间集合对象对应的顺序调整信息,分别调整第一类名集合对象和第一函数名称集合对象中元素的排列顺序,确定第二类名集合对象和第二函数名称集合对象;根据第二延迟时间集合对象中延迟时间的排列顺序,依次进行定时操作,并根据第二类名集合对象和第二函数名称集合对象,确定并加载与当前延迟时间对应的当前启动对象。

具体地,本实施例中获得的第一延迟时间集合对象中的各延迟时间并不是从小到大的顺序进行排列的,从而需要将第一延迟时间集合对象中的各延迟时间进行升序排列。通过调节第一延迟时间集合对象中延迟时间的排列顺序,可以实现对启动对象的自动调度。根据第一延迟时间集合对象中延迟时间的顺序调整信息,可以对第一类名集合对象和第一函数名称集合对象中元素的排列顺序进行相应调整,将调整后的第一类名集合对象和第一函数名称集合对象分别确定为第二类名集合对象和第二函数名称集合对象。本实施例可以通过直接调用定时器timer类的方式,根据第二延迟时间集合对象中的延迟时间来进行定时操作,并根据当前延迟时间对应的当前类名和当前启动函数名称,可以对当前启动对象进行加载,从而实现启动对象的动态加载,即启动函数的动态执行。

本实施例的技术方案,通过获取启动应用程序时需要加载的多个启动对象,并利用延时注册函数,基于启动对象对应的枚举类型的优先级信息和权重信息动态计算启动对象对应的延迟时间,以避免直接传入延迟时间而存在的重复性情况,并对每个启动对象存储的启动函数进行统一的延时注册,从而可以根据第一延迟时间集合对象中延迟时间的先后顺序,对每个启动对象进行自动调度和动态加载,以避免在启动应用程序时同时加载所有启动对象的情况,从而提高了应用程序的启动速度,以及提升了用户体验。

实施例二

图2为本发明实施例二提供的一种基于延时注册的应用启动方法的流程图,本实施例在上述实施例的基础上,对延时注册函数实现的功能进行了优化。其中与上述实施例相同或相应的术语的解释在此不再赘述。

参见图2,本实施例提供的基于延时注册的应用启动方法具体包括以下步骤:

s210、获取应用程序的多个启动对象以及每个启动对象对应的类名、启动函数名称、优先级信息和权重信息。

s220、确定预设优先级枚举变量中与优先级信息对应的目标优先级数值,以及预设权重枚举变量中与权重信息对应的目标权重值。

其中,预设优先级枚举变量是预先定义的,用于表征优先级信息与优先级数值之间的映射关系。预设权重枚举变量是预先定义的,用于表征权重信息与权重值之间的映射关系。预设优先级枚举变量和预设权重枚举变量中枚举元素的数量可以根据用户需求和实际应用场景预先确定。

示例性地,预设优先级枚举变量可以定义为:

publicenumpriority{

priority_1=1,

priority_2,

priority_3,

...

}

其中,priority是预设优先级枚举变量的变量名称,其具有公有权限修饰符public,以使每个启动对象具有访问的权限。预设优先级枚举变量priority的枚举值有priority_1、priority_2、priority_3等。在设计枚举值时,通过priority_1=1的方式将priority_1的值设置为1,从而编译器可以对后续所有的枚举值通过自动累加1的方式进行赋值。也就是说,编译器将priority_2的值设置为2,priority_3的值设置为3,依次类推。需要注意的是,本实施例中启动对象对应的优先级越高,其对应的目标优先级数值越小。本实施例通过编译器技术和预设优先级枚举变量的唯一性,可以保证启动对象对应的优先级顺序。

示例性地,预设权重枚举变量可以定义为:

其中,weight是预设权重枚举变量的变量名称,其具有公有权限修饰符public,以使每个启动对象具有访问的权限。预设权重枚举变量weight与预设优先级枚举变量priority的含义类似,可参照上述对预设优先级枚举变量priority的解释。

具体地,根据启动对象对应的优先级信息,确定预设优先级枚举变量中与该优先级信息对应的目标优先级数值;根据启动对象对应的权重信息,确定预设权重枚举变量中该权重信息对应的目标权重值。

s230、根据目标优先级数值和目标权重值,确定启动对象对应的延迟时间。

具体地,根据每个启动对象对应的目标优先级数值和目标权重值可以计算每个启动对象对应的延迟时间。示例性地,可以根据如下公式确定启动对象对应的延迟时间:

t=λ1p+λ2w

其中,t是启动对象对应的延迟时间;p是目标优先级数值;w是目标权重值;λ1和λ2均是预设调节系数。本实施例可以通过调节λ1和λ2的大小,来调整优先级信息与权重信息在延迟时间中的占用比例。例如,λ1和λ2分别设置为100和10,使得优先级信息与权重信息的占用比例为10:1。若某个启动对象对应的目标优先级数值p为1,目标权重值为2,则该启动对象对应的延迟时间为120。本实施例中的延迟时间delay可以是长整型long类型的信息。延迟时间的单位可以设置为毫秒ms。

s240、若检测第一类名集合对象中不包含启动对象对应的类名,则调用第一类名集合对象中的类名添加函数,将启动对象对应的类名添加至第一类名集合对象中。

其中,类名添加函数是预先定义的,可以将启动对象对应的类名添加至第一类名集合对象中的函数。

具体地,本实施例在对启动对象存储的启动函数进行注册时,可以先对启动对象对应的类名进行校验,并在校验成功后再进行添加类名操作。本实施例可以通过调用第一类名集合对象listclass中的类名查询函数listclass.contains(classname),来检测listclass中是否包含启动对象对应的类名classname,若是,即类名查询函数返回true,则表明该类名对应的类已经注册过,此时无需再次进行注册,直接通过return返回即可;若否,即类名查询函数返回false,则通过调用第一类名集合对象listclass中的类名添加函数listclass.add(classname),将启动对象对应的类名classname添加至listclass中,从而仅在第一类名集合对象中添加合法的类名,以保证注册后的每个启动对象均可以被正常加载。

s250、若检测启动对象对应的启动函数名称不为空,且第一函数名称集合对象中不包含启动函数名称,则调用第一函数名称集合对象中的函数名称添加函数,将启动对象对应的函数名称添加至第一函数名称集合对象中。

其中,函数名称添加函数是预先定义的,可以将启动对象对应的启动函数名称添加至第一函数名称集合对象中的函数。

具体地,在将classname添加至listclass后,可以通过调用名称检测函数textutils.isempty(funcname),检测启动对象对应的启动函数名称funcname是否为空,若是,则表明该启动函数名称为非法数据,此时删除listclass中已添加的该启动对象对应的类名,并通过return返回;若否,则可以通过调用第一函数名称集合对象listfuncname中的函数名称查询函数listfuncname.contains(funcname),检测listfuncname中是否包含启动对象对应的funcname,若包含,则表示该启动函数已经注册,此时直接通过return返回;若不包含,则可以通过调用listfuncname中的函数名称添加函数listfuncname.add(funcname),将该启动对象对应的启动函数名称funcname添加至listfuncname中。

s260、若检测启动对象对应的延迟时间大于或等于预设时间,则调用第一延迟时间集合对象中的延迟时间添加函数,将启动对象对应的延迟时间添加至第一延迟时间集合对象中。

其中,延迟时间添加函数可以是预先定义的,可以将启动对象对应的延迟时间添加至第一延迟时间集合对象中的函数。预设时间可以根据调度模块的初始化时间以及其它基础功能模块初始化时间进行设置。示例性地,预设时间可以设置为100ms。

具体地,在将funcname添加至listfuncname后,检测启动对象对应的延迟时间delay是否大于预设时间,若否,则表明该启动对象需要在预设时间之前启动,即在初始化调度模块和其它基础模块结束之前加载该启动对象,由于在调度模块和其它基础模块初始化未结束时是无法加载启动对象的,从而该启动对象是不合法的,无法被加载,此时可以删除listclass中已添加的该启动对象对应的类名以及删除listfuncname中该启动对象对应的启动函数名称,并通过return返回;若延迟时间delay大于或等于预设时间,则可以通过调用第一延迟时间集合对象listdelay中的延迟时间添加函数listdelay.add(delay),将该启动对象对应的延迟时间delay添加至listdelay中。

需要注意的是,本实施例可以重复执行s220-s260,实现对每个启动对象中的启动函数进行延时注册的功能。本实施例可以在类名校验成功后再进行启动函数名称的校验,以及在启动名称函数校验成功后再计算和校验延迟时间。在对启动对象的类名、启动函数名称和延迟时间进行校验时也不限于本实施例给出了的校验顺序,也可以为其他顺序,比如先校验启动对象对应的延迟时间,再校验类名,最后校验启动函数名称。

s270、根据第一类名集合对象、第一函数名称集合对象和第一延迟时间集合对象,对启动对象进行调度和加载。

本实施例的技术方案,通过在对启动对象存储的启动函数进进行延时注册时,先对启动对象的类名、启动函数名称和延迟时间进行校验,并在校验成功后再添加至相应集合对象中,从而可以仅对合法的启动对象进行注册,以保证注册后的每个启动对象均可以被正常加载,避免启动应用程序时出现启动异常的现象。

在上述技术方案的基础上,s230可以包括:根据预先获取的系统配置信息和启动对象的个数确定调节参数值;根据目标优先级数值、目标权重值和调节参数值确定启动对象对应的延迟时间。

其中,系统配置信息可以是指运行应用程度的系统的配置信息,比如包括中央处理器cpu的核心数、主频、内存空间等。调节参数值可以是用于调节延迟时间的数值。

示例性地,在系统配置信息包括中央处理器cpu的核心数和内存空间时,可以根据如下公式确定调节参数值:

s=dq-dc-dm

其中,s是调节参数值;dq是启动对象的个数;dc是cpu的核心数;dm是内存空间。本实施例中的内存空间dm可以以gb(gigabyte,十亿字节)为计算单位。

示例性地,可以根据如下公式确定启动对象对应的延迟时间:

t=λ1p+λ2w+s

其中,t是启动对象对应的延迟时间;p是目标优先级数值;w是目标权重值;s是调节参数值;λ1和λ2均是预设调节系数。本实施例通过基于系统配置信息和启动对象的个数来确定启动对象对应的延迟时间,可以更加精确地计算每个启动对象对应的延迟时间,并且可以更好地适用于在不同系统配置下应用程序的启动,以便可以提高系统资源的利用率。

实施例三

图3为本发明实施例三提供的一种基于延时注册的应用启动方法的流程图,本实施例在上述实施例的基础上,对“根据第二延迟时间集合对象中延迟时间的排列顺序,依次进行定时操作,并根据第二类名集合对象和第二函数名称集合对象,确定并加载与当前延迟时间对应的当前启动对象”进行了优化。其中与上述实施例相同或相应的术语的解释在此不再赘述。

参见图3,本实施例提供的基于延时注册的应用启动方法具体包括以下步骤:

s310、获取应用程序的多个启动对象以及每个启动对象对应的类名、启动函数名称、优先级信息和权重信息。

s320、以类名、启动函数名称、优先级信息和权重信息为函数输入参数,调用启动对象中的延时注册函数,确定每个启动对象对应的延迟时间,并对每个启动对象存储的启动函数进行注册,获得注册后的第一类名集合对象、第一函数名称集合对象和第一延迟时间集合对象。

s330、对第一延迟时间集合对象中的各延迟时间进行升序排列,并将排列后的第一延迟时间集合对象确定为第二延迟时间集合对象。

s340、根据第一延迟时间集合对象对应的顺序调整信息,分别调整第一类名集合对象和第一函数名称集合对象中元素的排列顺序,确定第二类名集合对象和第二函数名称集合对象。

s350、将第二延迟时间集合对象中的第一个延迟时间均作为当前目标时间和当前延时元素,并获得当前延时元素的后一延时元素。

其中,当前目标时间可以是指定时器的定时时间。当加载第一个延迟时间对应的启动对象时,可以直接将第一个延迟时间作为当前目标时间,以便在到达当前目标时间时,可以加载该启动对象。当前延时元素是指第二延迟时间集合对象中的一个延迟时间。在第一次循环周期内,将第二延迟时间集合对象中的第一个延迟时间作为当前延时元素。后一延时元素可以是根据第二延迟时间集合对象中延迟时间的排列顺序,与当前延时元素相邻的后一个延迟时间。若当前延时元素为第一延迟时间集合对象中第一个延迟时间,则后一延时元素为第一延迟时间集合对象中第二个延迟时间。

示例性地,可以定义三个整型int类型的元素变量:intdelay1=0,intdelay2=0,intdelay3=0,利用元素变量delay1、delay2和delay3分别存储当前延时元素、后一延时元素和当前目标时间。还可以定义一个整型int类型的索引号变量:intindex=0,利用索引号变量index来存储当前延时元素对应的当前元素索引号。在第一个循环周期内,对delay1、delay2、delay3和index进行赋值,即将第二延迟时间集合对象中的第一个延迟时间均赋值给delay1和delay3,将第二个延迟时间赋值给delay2,索引号变量index赋值为0。

s360、以当前延时元素对应的当前元素索引号和当前目标时间为函数输入参数,调用消息处理对象中的消息发送函数,于延迟当前目标时间后,获取包含当前元素索引号的延迟消息。

其中,消息处理对象可以是预先创建的一个全局的handler对象。本实施例中的消息处理对象可以通过privatehandlermhandler来创建,并通过调用mhandler=newhandler()来实例化消息处理对象mhandler。消息发送函数是预先定义,可以用于发送延迟消息的函数。消息发送函数具有两个输入参数,第一个输入参数为int类型的参数,用于唯一标识一条延迟消息,以便区分不同的延迟消息。本实施例将当前延时元素对应的当前元素索引号index直接作为第一个输入参数,即作为在mhandler的定时器消息中的唯一标识符,从而可以更加便捷地区分不同的延迟消息。第二个输入参数为当前目标时间delay3,用于表征延迟消息的发送时间,即定时器的定时时间。

本实施例需要开启多个定时器,以便逐次分批地加载启动对象。若直接通过调用timer类来开启定时器,其性能损耗较高。针对于此,本实施例通过android中的用于线程通行的handler类来进行定时器的开启,从而可以大大降低性能损耗。具体地,可以以当前延时元素对应的当前元素索引号index和当前目标时间delay3作为输入参数,调用消息处理对象mhandler中的消息发送函数mhandler.sendmessagedelay(index,delay3),在延迟当前目标时间delay3后,可以获得一个消息内容为index的延迟消息。

s370、在获取延迟消息时,根据第二类名集合对象和第二函数名称集合对象,确定并加载与当前元素索引号对应的当前启动对象。

具体地,当获得延迟消息时,表明已经到达了定时器的定时时间,此时需要确定和加载相应的启动对象。根据获取的延迟消息可以得到延迟消息中的当前元素索引号index,从而根据该当前元素索引号可以确定当前启动对象。由于第二延迟时间集合对象、第二类名集合对象和第二函数名称集合对象在同一元素索引号下分别对应的延迟时间、类名和启动函数名称均属于同一启动对象的,从而可以根据第二延迟时间集合对象中的当前元素索引号确定在第二类名集合对象中当前延时元素对应的当前类名,以及在第二函数名称集合对象中当前延延时元素对应的当前启动函数名称,从而根据当前类名和当前启动函数名称可以确定并加载当前启动对象。

s380、检测当前延时元素是否为第二延迟时间集合对象中的最后一个延迟时间,若是,则进入步骤s390;若否,则进入步骤s391。

具体地,本实施例可以在获得延迟消息时,根据延迟消息中的当前元素索引号来检测当前延时元素是否为第二延迟时间集合对象中的最后一个延迟时间,以便确定所有的启动对象是否全部被加载完毕。若当前延时元素是最后一个延迟时间,则表明启动应用程序时所需要延迟加载的启动对象均加载完毕,此时可以执行步骤s390的操作。若当前延时元素不是最后一个延迟时间,则表明还需开启下一个定时器,以加载下一个启动对象,此时可以执行步骤s391的操作,以便及时开启下一个定时器。

示例性地,当前延时元素对应的当前元素索引号index的取值范围可以为:0≤index≤listdelay.size()-1,其中,listdelay.size()表示第二延迟时间集合对象listdelay中延时元素的总数。

s390、应用程序启动结束。

具体地,在当前延时元素为第二延迟时间集合对象中的最后一个延迟时间时,表明启动应用程序时所需要延迟加载的启动对象均按照相应的定时周期加载完毕,此时可以直接确定应用程序启动结束。

s391、将后一延时元素与当前延时元素之间的时间差更新为当前目标时间,以及将后一延时元素更新为当前延时元素,并返回执行步骤s360。

具体地,在当前延时元素不是第二延迟时间集合对象中的最后一个延迟时间时,需要确定下一个定时器的定时时间,以便加载下一个启动对象。本实施例中每个启动对象对应的延迟时间均是从应用程序的开始启动时刻算起的,从而下一个定时器的定时时间应为后一延时元素与当前延时元素之间的时间差。本实施例通过更新当前目标时间delay3为后一延时元素delay2与当前延时元素delay1之间的时间差,来设置下一个定时器的定时时间,即delay3=delay2-delay1。在当前目标时间更新后,将当前延时元素的后一延时元素更新为当前延时元素,即当前元素索引号index进行自加操作index++,以及更新delay1和delay2中的数据,以便可以将第二延迟时间集合对象中的延迟时间依次确定为当前延时元素,从而可以依次加载相应的启动对象。在将当前目标时间和当前延时元素更新后,通过重复执行步骤s360-s380进入下一个循环周期。

需要注意的是,若第二延迟时间集合对象中相邻的两个延迟时间相同,即定时器的定时时间为零,此时可以同时加载这两个延迟时间对应的启动对象。本实施例还可以将步骤s370-s391所提供的功能进行封装为消息处理对象mhandler中的消息接收函数handlemessage(),从而可以以延迟消息为输入参数,直接调用消息处理对象mhandler中的消息接收函数mhandler.handlemessage(),对延迟消息进行处理,使得操作更加便捷。

本实施例的技术方案,通过利用线程通行的handler类来进行定时器的开启操作,并利用对第二延迟时间集合对象中的每个延迟时间进行循环遍历的方式,从而可以按照延迟时间的先后顺序,依次加载相应的启动对象,降低了性能损耗,提高了运行效率,从而进一步提高了应用程序的启动速度。

在上述技术方案的基础上,s340可以包括:对第一延迟时间集合对象中的各延迟时间进行升序排列时,记录每个延迟时间在排列之前的第一位置以及排列之后的第二位置;根据各延迟时间对应的第一位置和第二位置,对第一类名集合对象中的各类名进行排列,并将排列后的第一类名集合对象确定为第二类名集合对象;根据各延迟时间对应的第一位置和第二位置,对第一函数名称集合对象中的各函数名称进行排列,并将排列后的第一函数名称集合对象确定为第二函数名称集合对象。

其中,第一延迟时间集合对象对应的顺序调整信息可以是指第一延迟时间集合对象中的每个延迟时间在排列之前的第一位置indexori以及排列之后的第二位置indexnow。

具体地,在对第一延迟时间集合对象进行升序排序时,可以将每个延迟时间对应的第一位置indexori和第二位置indexnow记录在一个映射表中,从而可以根据这个映射表来调整第一类名集合对象和第一函数名称集合对象中的排列顺序。示例性地,若第一延迟时间集合对象中的某个延迟时间a在排列之前位于集合中的第一个位置,即indexori=1,排列之后位于集合中的第三个位置,即indexnow=3,则基于此,可以将第一类名集合对象中位于第一个位置的类名调整至集合中的第三个位置,以及将第一函数名称集合对象中位于第一个位置的启动函数名称调整至集合中的第三个位置。同理,可以对第一类名集合对象和第一函数名称集合对象中的每个元素进行调整,获得第二类名集合对象和第二函数名称集合对象。本实施例中的第二延迟时间集合对象、第二类名集合对象和第二函数名称集合对象中的元素均是一一对应的,并且延迟时间是从小到大的顺序进行排列的。

在上述技术方案的基础上,s370可以包括:以当前元素索引号为函数输入参数,调用第二类名集合对象中的类名获取函数,确定当前元素索引号对应的当前类名;以当前元素索引号为函数输入参数,调用第二函数名称集合对象中的函数名称获取函数,确定当前元素索引号对应的当前启动函数名称;以当前启动函数名称为函数输入参数,调用当前类名对应的目标类对象中的对象加载函数,加载与当前启动函数名称对应的当前启动对象。

其中,类名获取函数可以是预先定义的,可以用于获取第二类名集合对象中元素索引号对应的类名的函数。函数名称获取函数可以是预先定义的,可以用于获取第二函数名称集合对象中元素索引号对应的启动函数名称的函数。目标类对象是指当前类名对应的类class类型的对象。对象加载函数可以是指基于反射机制的,用于直接加载对象的函数。本实施例中的对象加载函数可以为invoke()函数。

具体地,以当前元素索引号index为函数输入参数,调用第二类名集合对象listclass中的类名获取函数调用listclass.get(index),可以获得index对应的当前类名,如利用mclass表征当前类名。调用第二函数名称集合对象listfuncname中的函数名称获取函数listfuncname.get(index),可以获得index对应的当前启动函数名称,如利用mfuncname表征当前启动函数名称。以当前启动函数名称mfuncname为函数输入参数,调用当前类名mclass对应的目标类对象mclass对象中的对象加载函数mclass.invoke(mfuncname),加载与当前启动函数名称mfuncname对应的当前启动对象,即执行当前启动函数名称mfuncname对应的初始化函数,其中mfuncname函数内部是具体的启动所需要自行的业务逻辑,从而可以完成整个启动对象的自行。

在上述技术方案的基础上,在s370之前,还可以包括:开启一个新线程,以在新线程中,执行根据第二类名集合对象和第二函数名称集合对象,确定并加载与当前元素索引号对应的当前启动对象的操作。

具体地,本实施例可以通过调用threadmthread=newthread(),开启一个新线程,以便在开启的新线程中加载当前启动对象,从而可以避免自动在主线程中进行加载操作,进而可以避免导致主线程卡顿或者引用异常的情况,提高了运行性能。

以下是本发明实施例提供的基于延时注册的应用启动装置的实施例,该装置与上述各实施例的基于延时注册的应用启动方法属于同一个发明构思,在基于延时注册的应用启动装置的实施例中未详尽描述的细节内容,可以参考上述基于延时注册的应用启动方法的实施例。

实施例四

图4为本发明实施例四提供的一种基于延时注册的应用启动装置的结构示意图,本实施例可适用于启动基于android系统的应用程序的情况,该装置具体包括:启动对象获取模块410、延时注册模块420和启动对象调度加载模块430。

其中,启动对象获取模块410,用于获取应用程序的多个启动对象以及每个启动对象对应的类名、启动函数名称、优先级信息和权重信息,其中优先级信息和权重信息均为枚举类型的;延时注册模块420,用于以类名、启动函数名称、优先级信息和权重信息为函数输入参数,调用启动对象中的延时注册函数,确定每个启动对象对应的延迟时间,并对每个启动对象存储的启动函数进行注册,获得注册后的第一类名集合对象、第一函数名称集合对象和第一延迟时间集合对象;启动对象调度加载模块430,用于根据第一类名集合对象、第一函数名称集合对象和第一延迟时间集合对象,对启动对象进行调度和加载。

可选地,延时注册模块420包括延迟注册函数执行单元,延迟注册函数执行单元用于通过如下步骤实现确定每个启动对象对应的延迟时间,并对每个启动对象存储的启动函数进行注册的功能:

确定预设优先级枚举变量中与优先级信息对应的目标优先级数值,以及预设权重枚举变量中与权重信息对应的目标权重值;根据目标优先级数值和目标权重值,确定启动对象对应的延迟时间;若检测第一类名集合对象中不包含启动对象对应的类名,则调用第一类名集合对象中的类名添加函数,将启动对象对应的类名添加至第一类名集合对象中;若检测启动对象对应的启动函数名称不为空,且第一函数名称集合对象中不包含启动函数名称,则调用第一函数名称集合对象中的函数名称添加函数,将启动对象对应的函数名称添加至第一函数名称集合对象中;若检测启动对象对应的延迟时间大于或等于预设时间,则调用第一延迟时间集合对象中的延迟时间添加函数,将启动对象对应的延迟时间添加至第一延迟时间集合对象中。

可选地,根据目标优先级数值和目标权重值,确定启动对象对应的延迟时间,包括:

根据预先获取的系统配置信息和启动对象的个数确定调节参数值;根据目标优先级数值、目标权重值和调节参数值确定启动对象对应的延迟时间。

可选地,系统配置信息包括中央处理器cpu的核心数和内存空间;相应地,根据如下公式确定调节参数值:

s=dq-dc-dm

其中,s是调节参数值;dq是启动对象的个数;dc是cpu的核心数;dm是内存空间。

可选地,根据如下公式确定启动对象对应的延迟时间:

t=λ1p+λ2w+s

其中,t是启动对象对应的延迟时间;p是目标优先级数值;w是目标权重值;s是调节参数值;λ1和λ2均是预设调节系数。

可选地,启动对象调度加载模块430,包括:

第二延迟时间集合对象确定单元,用于对第一延迟时间集合对象中的各延迟时间进行升序排列,并将排列后的第一延迟时间集合对象确定为第二延迟时间集合对象;

排列顺序调整单元,用于根据第一延迟时间集合对象对应的顺序调整信息,分别调整第一类名集合对象和第一函数名称集合对象中元素的排列顺序,确定第二类名集合对象和第二函数名称集合对象;

定时加载单元,用于根据第二延迟时间集合对象中延迟时间的排列顺序,依次进行定时操作,并根据第二类名集合对象和第二函数名称集合对象,确定并加载与当前延迟时间对应的当前启动对象。

可选地,定时加载单元,包括:

当前延时元素确定子单元,用于将第二延迟时间集合对象中的第一个延迟时间均作为当前目标时间和当前延时元素,并获得当前延时元素的后一延时元素;

延迟消息发送子单元,用于以当前延时元素对应的当前元素索引号和当前目标时间为函数输入参数,调用消息处理对象中的消息发送函数,于延迟当前目标时间后,获取包含当前元素索引号的延迟消息;

当前启动对象加载子单元,用于在获取延迟消息时,根据第二类名集合对象和第二函数名称集合对象,确定并加载与当前元素索引号对应的当前启动对象;

当前延时元素检测子单元,用于检测当前延时元素是否为第二延迟时间集合对象中的最后一个延迟时间;

启动结束子单元,用于若是,则应用程序启动结束;

更新返回子单元,用于若否,则将后一延时元素与当前延时元素之间的时间差更新为当前目标时间,以及将后一延时元素更新为当前延时元素,并返回执行以当前延时元素对应的当前元素索引号和当前目标时间为函数输入参数,调用消息发送函数的操作。

可选地,当前启动对象加载子单元,具体用于:

以当前元素索引号为函数输入参数,调用第二类名集合对象中的类名获取函数,确定当前元素索引号对应的当前类名;以当前元素索引号为函数输入参数,调用第二函数名称集合对象中的函数名称获取函数,确定当前元素索引号对应的当前启动函数名称;以当前启动函数名称为函数输入参数,调用当前类名对应的目标类对象中的对象加载函数,加载与当前启动函数名称对应的当前启动对象。

本发明实施例所提供的基于延时注册的应用启动装置可执行本发明任意实施例所提供的基于延时注册的应用启动方法,具备执行基于延时注册的应用启动相应的功能模块和有益效果。

实施例五

本实施例五提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本发明任意实施例的一种基于延时注册的应用启动方法,该方法包括:

获取应用程序的多个启动对象以及每个启动对象对应的类名、启动函数名称、优先级信息和权重信息,其中优先级信息和权重信息均为枚举类型的信息;

以类名、启动函数名称、优先级信息和权重信息为函数输入参数,调用启动对象中的延时注册函数,确定每个启动对象对应的延迟时间,并对每个启动对象存储的启动函数进行注册,获得注册后的第一类名集合对象、第一函数名称集合对象和第一延迟时间集合对象;

根据第一类名集合对象、第一函数名称集合对象和第一延迟时间集合对象,对启动对象进行调度和加载。

本发明实施例的计算机存储介质,可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是但不限于:电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。

计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。

计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、rf等等,或者上述的任意合适的组合。

可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言,诸如java、smalltalk、c++,还包括常规的过程式程序设计语言—诸如“c”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络,包括局域网(lan)或广域网(wan),连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。

本领域普通技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个计算装置上,或者分布在多个计算装置所组成的网络上,可选地,他们可以用计算机装置可执行的程序代码来实现,从而可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件的结合。

注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1