发明内容
(一)要解决的技术问题
针对现有技术中服务不停地启动和结束,浪费系统资源的缺陷,本发明提供安卓服务生命周期管理方法、服务管理对象及安卓系统。
(二)技术方案
本发明公开一种安卓系统服务生命周期管理方法,其包括:
启动安卓系统的核心服务的服务管理对象;
所述服务管理对象获取服务映射文件中可调用服务的服务列表,并根据所述服务列表准备可正常调用的服务;
所述服务管理对象接收调用服务需求;
所述服务管理对象根据所述调用服务需求和所述服务映射文件,返回服务调用指令,供调用已准备的服务。
在一些实施例中,优选为,在所述启动安卓系统的核心服务的服务管理对象之前,所述安卓系统服务生命周期管理方法包括:创建服务管理对象。
在一些实施例中,优选为,在所述启动安卓系统的核心服务的服务管理对象之前,所述安卓系统服务生命周期管理方法包括:创建服务映射文件。
在一些实施例中,优选为,所述服务映射文件包括:服务的名称、所属位置、启动方式、KEY。
在一些实施例中,优选为,所述服务列表的获取方式包括:所述服务管理对象从安卓系统数据库存储的所述服务映射文件中获取所述服务列表。
在一些实施例中,优选为,所述服务映射文件在所述安卓系统数据库中存储的方式包括:
所述服务管理对象首次启动时,所述服务管理对象将所述服务映射文件写入所述安卓系统数据库;
所述服务管理对象非首次启动时,若所述服务管理对象中的所述服务映射文件发生更新,则所述服务管理对象将更新的服务映射文件替换所述安卓系统数据库中存储的服务映射文件。
在一些实施例中,优选为,所述服务管理对象从安卓系统数据库存储的所述服务映射文件中获取所述服务列表包括:
所述服务管理对象建立获取服务列表的指令;
所述服务管理对象根据所述指令检查其包含的服务映射文件是否发生更新;
如果发生更新,所述服务管理对象将更新的服务映射文件替换所述安卓系统数据库中存储的服务映射文件;所述服务管理对象从所述安卓系统数据库存储的最新的服务映射文件中获取服务列表;
如果未发生更新,所述服务管理对象从所述安卓系统数据库存储的服务映射文件中获取服务列表。
在一些实施例中,优选为,根据所述服务列表准备可正常调用的服务包括:
所述服务管理对象启动所述服务列表中的服务,并尝试绑定该服务;
若绑定成功,则将该服务列为可正常调用的服务;
若绑定失败,则重试;若重试成功,则将所述服务列为可正常调用的服务;若重试次数达到上限,则将所述服务列为永久失败;
所述服务管理对象对所述可正常调用的服务的接口进行封装管理。
在一些实施例中,优选为,所述服务管理对象对所述可正常调用的服务的接口进行封装管理包括:
所述服务管理对象通过哈希表为每一个所述可正常调用的服务建立位置对应,还通过死亡报告为每一个所述可正常调用的服务建立生命跟踪;所述哈希表包括:KEY和VALUE的键值对;
所述死亡报告中出现死亡结果时,所述服务管理对象将死亡结构对应的服务重新准备为可正常调用的服务。
在一些实施例中,优选为,所述服务管理对象根据所述调用服务需求和所述服务映射文件,向第三方程序返回服务调用指令包括:
所述服务管理对象根据所述调用服务需求确定待调用服务的key;
所述服务管理对象根据所述待调用服务的key,在所述哈希表和所述服务映射文件中找到相应的服务及服务调用指令,向第三方程序返回所述服务调用指令。
本发明还提供了一种所述安卓系统服务生命周期管理方法中的服务管理对象,其包括:服务启动模块、服务管理模块和包含可调用服务的服务映射文件;其中,
所述服务启动模块,用于在服务管理对象启动后获取所述服务映射文件的服务列表,并根据所述服务列表准备可正常调用的服务;
所述服务管理模块,用于接收第三方程序的调用服务需求;并根据所述调用服务需求和所述服务映射文件,向第三方程序返回服务调用指令,供所述第三方程序调用已准备的服务。
在一些实施例中,优选为,所述服务启动模块包括:写入单元和检查单元;
所述写入单元,用于服务管理对象首次启动时,将所述服务映射文件写入所述安卓系统数据库;在服务映射文件发生更新,将更新的服务映射文件替换所述安卓系统数据库中存储的服务映射文件;
所述检查单元,用于检查服务管理对象中的所述服务映射文件发生更新,并将检查结果反馈所述写入单元。
在一些实施例中,优选为,所述服务启动模块还包括:获取单元;
所述获取单元,用于生成获取服务列表的指令,并向所述检查单元发送检查指令,且待所述检查单元和所述写入单元工作后,从安卓系统数据库中存储的服务映射文件中获取服务映射文件;
所述检查单元,根据所述检查指令,检查服务管理对象中的所述服务映射文件发生更新,并将检查结果反馈所述写入单元。
在一些实施例中,优选为,所述服务启动模块还包括:准备单元;
所述准备单元,用于服务管理对象启动所述服务列表中的服务,并尝试绑定该服务;若绑定成功,则将该服务列为可正常调用的服务;若绑定失败,则重试;若重试成功,则将所述服务列为可正常调用的服务;若重试次数达到上限,则将所述服务列为永久失败。
在一些实施例中,优选为,所述服务管理模块包括:第一注册单元、第二注册单元、通讯单元;
所述第一注册单元,用于为每一个所述可正常调用的服务建立位置对应的哈希表;
所述第二注册单元,用于为每一个所述可正常调用的服务建立生命跟踪的死亡报告,当所述死亡报告中出现死亡结果时,向所述服务启动模块发送将死亡结构对应的服务重新准备为可正常调用的服务;
所述通讯单元,用于根据所述调用服务需求确定待调用服务的key;根据所述待调用服务的key,在所述哈希表和所述服务映射文件中找到相应的服务及服务调用指令,向第三方程序返回所述服务调用指令。
本发明还提供了一种安卓系统,其包括:所述的服务管理对象。
(三)有益效果
本发明公开安卓服务生命周期管理方法、服务管理对象及安卓系统,安卓系统的核心服务对服务管理对象进行服务,确保该服务管理对象处于核心运行状态;而服务管理对象对可调用服务进行整体管理服务,服务管理对象启动后对可调用服务进行检测,确定这些服务为可正常调用的服务,当外部需要调用该服务时,服务管理对象返回服务调用指令,供调用服务。通过该服务管理对象对服务进行统一管理服务,服务本身无需浪费资源想方设法进行存活,服务在需要的时候直接被调取即可,这种方式能够解决安卓系统内的大量资源,避免各服务在不需要时运行而浪费资源,于整个系统而言,不存在肆意乱启动,总是再真的需要时才申请资源。
另一方面,虽然安卓系统核心服务层无法进行更新,但是服务管理对象又独立于安卓系统的核心服务层,所以服务管理对象可自由进行版本迭代,也适用于其管理服务的各服务进行版本迭代。让系统服务启动者、系统服务管理者和服务映射文件都能正常完成版本迭代。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
考虑到现有安卓系统中各种服务存在不断被停杀,又不断自启动的循环中,即便服务不处于使用状态,该循环也在不停进行,导致安卓系统中大量的资源被占用,严重影响安卓系统的使用。为此,本技术对服务生命周期进行管理。
图1示出安卓系统服务生命周期管理方法的步骤,其包括:
步骤01,启动安卓系统的核心服务的服务管理对象;
步骤02,服务管理对象获取服务映射文件中可调用服务的服务列表,并根据服务列表准备可正常调用的服务;
步骤03,服务管理对象接收调用服务需求;
步骤04,服务管理对象根据调用服务需求和服务映射文件,返回服务调用指令,供调用已准备的服务。
安卓系统的核心服务对服务管理对象进行服务,确保该服务管理对象处于核心运行状态;而服务管理对象对可调用服务进行整体管理服务,服务管理对象启动后对可调用服务进行检测,确定这些服务为可正常调用的服务,当外部需要调用该服务时,服务管理对象返回服务调用指令,供调用服务。通过该服务管理对象对服务进行统一管理服务,服务本身无需浪费资源想方设法进行存活,服务在需要的时候直接被调取即可,这种方式能够解决安卓系统内的大量资源,避免各服务在不需要时运行而浪费资源,于整个系统而言,不存在肆意乱启动,总是再真的需要时才申请资源。
接下来对该技术进行详细说明:
一种安卓系统服务生命周期管理方法,如图2和3所示,其包括:
步骤10,创建服务映射文件;
服务映射文件为安卓系统服务生命周期管理方法中较为关键的技术,其记载了服务的各类信息,比如:服务的名称、所属位置、启动方式、绑定方式、KEY等。为了对安卓系统中的服务进行全方位管理,建议服务映射文件中的服务是多种多样的,尽可能涵盖安卓系统中的所有服务。基于此,如果安卓系统中服务做了改变(增加或减小或更新),则服务映射文件也对应性修改。
还需要说明的是,服务映射文件中每一个元素都具备重要作用,比如:服务所属位置是找到相应服务的关键,服务的启动方式、绑定方式是服务调用中较为关键的技术,KEY方便服务的快速找寻。
步骤11,在安卓系统的核心服务层创建服务管理对象;
该步骤中是将服务管理对象在安卓系统的核心服务层进行核心服务设置。本步骤的前提在于研发服务管理对象,该服务管理对象(又称service core),其为本发明设计的核心技术,在后文的方法描述中,将逐步对其进行说明,本领域技术人员可以接下来的描述对服务管理对象的功能和设计进行清晰的了解。
步骤10和11是安卓系统的初始化过程,一旦设置完毕,后续跳过步骤10和11,直接执行步骤12-步骤20。
步骤12,启动安卓系统的核心服务的服务管理对象;
安卓系统启动后,安卓系统的核心服务包括服务管理对象,服务管理对象随安卓系统启动。
步骤14,服务管理对象获取服务映射文件中可调用服务的服务列表;
由于服务映射文件相当于对安卓系统内服务的登记,为了对安卓系统中的服务进行管理,需要利用该服务映射文件,比如利用服务列表获取服务的名称等信息。
需要说明的是,虽然上文提到服务管理对象中包含服务映射文件,但是,服务管理对象在获取服务映射文件中的服务列表时,获取的方式可以有多种方式,这些方式也基于服务映射文件的存放位置。下面举例说明:
例1,服务映射文件存储在安卓系统的数据库中,服务管理对象从数据库获取该服务映射文件。
该方式利用了安卓系统数据库的稳定性和方便读取、方便维护的特性。
该方法基于服务映射文件提前上传到安卓系统的数据库中。情况1,在服务管理对象加载到安卓系统中首次启动时即可以写入数据库中。情况2,随着服务的改变,服务映射文件会做一定个更新,这种情况下,服务管理对象可以再次将更新的服务映射文件写入数据库中替换原来的服务映射文件。
需要强调的是,由于服务管理对象需要从数据库读取服务映射文件,而且该服务映射文件必须是最新的,否则,影响后续操作,因此,建议在情况2中,读取前对数据库中的服务映射文件是否为最新的进行检查;或者,在服务映射文件更新后第一时间对数据库的服务映射文件进行替换,以免去后期检查的步骤。至于如何做检查,接下来给出一种实例对基于服务列表获取动作的数据库中服务映射文件的检查和服务列表获取进行具体的说明。
步骤141,服务管理对象建立获取服务列表的指令;
步骤143,服务管理对象根据指令检查其包含的服务映射文件是否发生更新;
步骤145-1,如果结果为“Y”,即发生更新,服务管理对象将更新的服务映射文件替换安卓系统数据库中存储的服务映射文件;服务管理对象从安卓系统数据库存储的最新的服务映射文件中获取服务列表;
步骤145-2,如果结果为“N”,即未发生更新,服务管理对象从安卓系统数据库存储的服务映射文件中获取服务列表。
例2,服务映射文件存放在服务管理对象的某个位置,服务管理对象内部调取。这种方式容易增加服务管理对象的运载,造成运载的不稳定性。
例3,服务映射文件存放在安卓系统的某个位置,该位置非数据库。这种方式依赖于该位置的稳定性,容易影响安卓系统的运载稳定性。
需要说明的是,本技术中优选将服务映射文件吸入数据库,通过访问数据库获取服务映射文件的服务列表。当然,本领域技术人员也可根据编程技术的进步,安卓系统的优化选择其他存放方式。
步骤16,服务管理对象根据服务列表准备可正常调用的服务;
可以理解,可正常调用的服务即为在被启动并运行时,该服务能够被启动,且运行稳定。
本步骤也是技术的关键,基于服务列表,准备可正常调用服务的方式:
A.服务管理对象启动服务列表中的服务,并尝试绑定该服务;
B1.若绑定成功,则将该服务列为可正常调用的服务;
B2.若绑定失败,则重试;若重试成功,则将服务列为可正常调用的服务;若重试次数达到上限,则将服务列为永久失败。
绑定失败的原因举例:1.目标服务没有安装到系统中;2.在smf中的服务描述信息有误;3.目标服务的自身异常导致服务正确启动。不过不局限于此三种,原因很多。
对于永久失败的服务可通过达到一些特殊的条件以后才会被重新激活,比如典型的一个条件:程序的卸载安装和更新。
服务管理对象对各服务进行检测,确保各服务都处于良好的可正常运行状态,一旦这些服务需要被调用时,能正常运行。在非调用状态,服务处于良好状态,而不运行。这样,各服务无需担心被调用时出现错误,也无需担心被系统停杀。因为服务管理对象在安卓系统的核心服务层运行,服务管理对象处于安卓系统努力维护的服务,所以,服务管理对象能够正常运行,对各服务进行管理,使各服务的启用处于安全、稳定的环境中。
另一方面,该步骤也面临着某些服务为不可正常调用的服务,不可成长调用的服务需要其他方式进行重新激活。
步骤18,服务管理对象对可正常调用的服务进行管理;
该步骤是为了便于可正常调用的服务进行快速、稳定的使用。具体为:
a.服务管理对象通过哈希表为每一个可正常调用的服务建立位置对应;哈希表包括:KEY和VALUE的键值对;
b.通过死亡报告为每一个可正常调用的服务建立生命跟踪;
死亡报告中出现死亡结果时,服务管理对象将死亡结构对应的服务重新准备为可正常调用的服务。
该步骤可以采用将可正常调用的服务的接口进行封装,调用时通过该接口调用服务。
步骤20,服务管理对象接收第三方程序的调用服务需求;并根据调用服务需求和服务映射文件,向第三方程序返回服务调用指令,供第三方程序调用已准备的服务。
该步骤是与第三方进行通讯,接收第三方的调用服务需求,向第三方反馈调用指令的步骤,通过该步骤,第三方能够快速调用服务。具体方式:
(1)服务管理对象接收第三方程序的调用服务需求;
(2)服务管理对象根据调用服务需求确定待调用服务的key;
调用服务需求中会包含服务的相关信息,服务管理对象可根据该相关信息提取服务对应的key。
(3)服务管理对象根据待调用服务的key,在哈希表和服务映射文件中找到相应的服务及服务调用指令,向第三方程序返回服务调用指令。
至此,安卓系统中的服务被安全、稳定的管理,且不会出现肆意开启的情况,而且能够快速响应第三方程序的调取。整个安卓系统的资源得到有效利用,避免浪费和无意义消耗。
接下来,提供一种安卓系统服务生命周期管理方法中的服务管理对象(servicecore),如图4所示,其包括:
服务启动模块(service starter)、服务管理模块(service manger)和包含可调用服务的服务映射文件(service映射文件);其中,
服务启动模块,用于在服务管理对象启动后获取服务映射文件的服务列表,并根据服务列表准备可正常调用的服务;
服务管理模块,用于接收第三方程序的调用服务需求;并根据调用服务需求和服务映射文件,向第三方程序返回服务调用指令,供第三方程序调用已准备的服务。
需要说明的是,服务启动模块(service starter)、服务管理模块(servicemanger)可以为一个程序,可以为一段代码。
为了方便服务启动模块将服务映射文件写入数据库,服务启动模块包括写入单元和检查单元;以实现首次启动和非首次启动时的写入操作。
写入单元,用于服务管理对象首次启动时,将服务映射文件写入安卓系统数据库;在服务映射文件发生更新,将更新的服务映射文件替换安卓系统数据库中存储的服务映射文件;
检查单元,用于检查服务管理对象中的服务映射文件发生更新,并将检查结果反馈写入单元。
即服务管理对象首次启动时,直接写入;非首次启动时,先通过检查单元进行检查,如果服务映射文件发生更新,则再次写入数据库。而检查单元的检查工作的启动方式可以有多种,比如:实时检查服务映射文件的更新状况;又比如:在需要从数据库读取服务映射文件时,启动检查单元的检查操作。
考虑到服务启动模块需要获取服务列表,因此,服务启动模块还包括:获取单元;
获取单元,用于生成获取服务列表的指令,并向检查单元发送检查指令,且待检查单元和写入单元工作后,从安卓系统数据库中存储的服务映射文件中获取服务映射文件;
检查单元,根据检查指令,检查服务管理对象中的服务映射文件发生更新,并将检查结果反馈写入单元。
考虑到服务启动模块需要对安卓系统中的服务进行初始化,通过初始化准备好各服务,处于可正常调用的服务。所以,服务启动模块还包括:准备单元;
准备单元,用于服务管理对象启动服务列表中的服务,并尝试绑定该服务;若绑定成功,则将该服务列为可正常调用的服务;若绑定失败,则重试;若重试成功,则将服务列为可正常调用的服务;若重试次数达到上限,则将服务列为永久失败。
服务管理模块对准备好的服务进行管理,所以服务管理模块包括:第一注册单元、第二注册单元、通讯单元;
第一注册单元,用于为每一个可正常调用的服务建立位置对应的哈希表;
第二注册单元,用于为每一个可正常调用的服务建立生命跟踪的死亡报告,当死亡报告中出现死亡结果时,向服务启动模块发送将死亡结构对应的服务重新准备为可正常调用的服务;
通讯单元,用于根据调用服务需求确定待调用服务的key;根据待调用服务的key,在哈希表和服务映射文件中找到相应的服务及服务调用指令,向第三方程序返回服务调用指令。
本发明还提供了一种安卓系统,如图5所示,其包括的服务管理对象、多个服务及核心服务层,三者相互连接。
接下来,基于音乐播放进行示例:
假设第三方程序对机器人说“播放音乐”,随后能够开始播放音乐。服务调用需要中的服务包括:录音服务、媒体播放服务、系统的TTS播放服务。
步骤0:在安卓系统中创建一个Boot程序,将其服务管理对象android:persistent="true"放入系统目录中,修改为系核心程序,Android总是会尽全力去保护这个程序,所以这个程序已经不需要我们去保护,这个程序只有一个任务就是保护好ServiceCore,维护后续步骤正常运行。而ServiceCore则辅助管理服务。这样的依赖保护让整个系统和结构都变得健壮。系统消耗降低,不会肆意的释放资源,不释放资源就不会服务无端被杀死,自然就不会肆意重启浪费资源,形成了一个良性的循环。
步骤1:编写服务映射文件,在Service映射文件中写明需要维护的服务有:录音服务、媒体播放、TTS语音合成服务。假定KEY分别为:VOICE,MEDIA,TTS。
步骤2:服务列表获取,服务管理对象随安卓系统启动后,ServiceStarter向服务管理对象全局配置GlobalConfig获取一份需要启动的服务列表。而且GlobalConfig内容来源于服务映射文件,当被请求这份列表时GlobalConfig内部会创建一个InitDatabaseUtil的工具去检查服务映射文件的配置文件的md5与之前记录的是否一致(服务映射文件更新后,服务映射文件的配置文件的md5会发生变化),如果有变化,将更新的服务映射文件更新到数据库中,然后更新配置文件md5记录值。最后GlobalConfig可以通过访问数据库,得到需要维护的服务列表。
步骤3:准备好需要的服务,ServiceStarter获取到了服务的列表根据服务列表中的描述信息可以区别出服务的绑定服务的方式是通过ContentProvider方式同步绑定,还是通过Context.bindService()的异步方式绑定。后者会使用CountDownLatch进行同步控制。ContentProvider重写call方法,再call方法返回Bundle已配置文件中的serviceName为key,put该服务的Binder。如若启动失败会加到失败队列中,会有重试的机会,当达到重试上限会加入永久失败列表,永久失败列表中的服务想获得重试的机会是一系列的判断,列该服务所在的程序更新,或者得到重新装载。
步骤4:管理准备好的服务,经过步骤3后ServiceStarter准备好一些服务,这些服务通过调用ServiceManger.addService的方法被添加到ServiceManger中,再添加的同时就为这些服务注册linkToDeath的死亡报告,当该服务突然中断死亡时,ServiceManger会收到这样一个报告,然后决定是否需要通知ServiceStarter重新准备好该服务。
步骤5,第三方程序获取服务,使用ServiceManger的getService方法传入对应的KEY就可以获取对应服务。如果当时服务没有准备好,会通知ServiceStarter快速准备好该服务,
ServiceStarter通过提供的KEY导数据中查询服务映射文件中对应服务的完整信息,然后重新准备该服务。
这样的一个通知和准备都是同步的。
步骤6,使用服务完成需求。如先使用VOICE KEY获取到系统的录音服务,知道用户说了什么,知道用户说了什么之后便可以知道用户的意图,假设为播放音乐,这样我们需要给用户播放“我爱北京天安门”,这时我们可以调用TSS,播放一段语音告诉用户“将为您播放北京天安门”。最后调用MEDIA 播放音乐。
如上述步骤,真正再完成需求时是非常便利的,只需要集中精力再业务逻辑层即可。
本技术提供一种系统服务的生命周期管理方法。android系统总是会用心去维护他的核心应用以确保它整个系统的稳定,而对其他程序维护确实相对比较粗暴的,导致大家不得不得想尽各种办法去维护自己导致资源浪费,而本发明很好的解决了这些问题。本发明通过系统核心应用Boot保护ServiceCore,而在ServiceCore中通过ServiceStarter和ServiceManger和Service映射文件的配合完成对系统服务生命周期的管理。这样的结合使用服务能够提供稳定的服务。对于使用者而言,什么时候想用服务总是存在。对于整个系统而言不存在肆意乱启动,总是再真的需要时才申请资源。而且避免了系统核心永久性应用无法更新的问题。让ServiceCore和其管理的服务都能正常完成版本迭代。
维护简单扩展性强,安全高效,性能消耗低。优点包括:
(1)创新的服务信息映射表,简单明了包含了远端服务位置功能和绑定方式。
(2)ServiveStarter首次启动从映射表获取数据存入到数据库提高效率,方便动态维护,内部还有服务启动失败记录,当时机合适时会重新启动服务。在获取这些服务时无论服务的绑定方式,在此都会控制为同步,降低了开发的难度,增强了易用性。
(3)用系统的核心应用去保护ServiceCore,ServiceCore再去管理其他的服务,这样的结构能使整体更加强健。而且避免了系统核心永久性应用无法更新的问题。让ServiceCore和其管理的服务都能正常完成版本迭代。
本发明的各个部件实施方式可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。应该注意的是上述实施方式对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施方式。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
虽然结合附图描述了本发明的实施方式,但是本领域技术人员可以在不脱离本发明的精神和范围的情况下做出各种修改和变型,这样的修改和变型均落入由所附权利要求所限定的范围之内。