启动插件服务的方法、装置和终端设备与流程

文档序号:12824491阅读:319来源:国知局
启动插件服务的方法、装置和终端设备与流程

本发明属于计算机技术领域,特别是涉及一种启动插件服务的方法、装置和终端设备。



背景技术:

插件是一种遵循一定规范的应用程序接口编写出来的程序,目前android系统使用插件提供的服务的方法包括:启动服务(startservice)、停止服务(stopservice)、绑定服务(bindservice)和解除绑定服务(unbindservice)。在android系统中使用插件提供的服务主要采用两种方案来实现:一种是通过在主程序中编写一个服务中介,利用这个服务中介通过反射机制来调用插件,其具体实现方法为:首先在主程序的androidmanifest.xml文件中声明此服务中介,然后在主程序中编写此服务中介,此服务中介的所有函数都是通过反射机制调用插件内部的函数来实现;另一种是通过在主程序中预设一些服务坑位,利用这些服务坑位来加载插件提供的服务,其具体实现方法为:首先预先在主程序的androidmanifest.xml文件中声明多个虚拟的服务注册信息,即服务坑位,然后为插件提供的服务分配相适配的服务坑位,将此服务加载到服务坑位所对应的进程空间中运行。

上述现有的两种方案虽然都能够实现对插件提供的服务的使用,然而,在具体实现过程中,我们发现上述现有的两种方案都存在着一定的局限性:第一种方案,要升级插件提供的服务必须先升级主程序,只有在升级了主程序后才能够使用升级后的服务,需要进行主程序升级的额外处理;第二种方案,由于预设的服务坑位数量有限,而服务常驻于后台,生命周期较长,这样很快预设的服务坑位就会被用完,而如果预设坑位过多又会导致启动速度受到影响,当第三方或者自己通过binder获取主程序应用的信息时,有可能会因信息过多而出现transactiontoolarge的异常。



技术实现要素:

本发明实施例要解决的一个技术问题是:提供一种启动插件服务的方法、装置和终端设备,可以在不需要设置坑位且不需要进行额外处理的情况下,启动插件提供的服务。

为解决上述技术问题,根据本发明实施例的一个方面,提供一种启动插件服务的方法,包括:

通过服务管理组件的binder对象接收客户端的启动服务请求信息;

根据所述启动服务请求信息启动所述服务管理组件所在的进程中的目标服务;

其中,所述服务管理组件管理其所在的进程中的所有服务,所述服务管理组件与所述客户端运行在不同的进程中。

在基于本发明上述方法的另一个实施例中,所述通过服务管理组件的binder对象接收客户端的启动服务请求信息,包括:

根据所述启动服务请求信息调用所述服务管理组件的aidl接口对象的startservice函数。

在基于本发明上述方法的另一个实施例中,所述根据所述启动服务请求信息启动所述服务管理组件所在的进程中的目标服务,包括:

通过所述服务管理组件中继承所述aidl接口的内部类对象访问所述服务管理组件核心类的startservice函数;其中所述服务管理组件的核心类实现所述aidl接口。

在基于本发明上述方法的另一个实施例中,所述根据所述启动服务请求信息启动所述服务管理组件所在的进程中的目标服务,包括:

根据所述启动服务请求信息,检测在所述服务管理组件中是否保存有目标服务安装信息;

若在所述服务管理组件中保存有目标服务安装信息,获取所述目标服务安装信息;

若在所述服务管理组件中未保存有目标服务安装信息,创建目标服务安装信息。

在基于本发明上述方法的另一个实施例中,所述创建目标服务安装信息,包括:

根据所述启动服务请求信息,检测在所述服务管理组件中是否保存有提供目标服务的插件;

若在所述服务管理组件中保存有提供目标服务的插件,从所述插件中获取目标服务的serviceinfo对象;

若在所述服务管理组件中未保存有提供目标服务的插件,从提供目标服务的插件的安装包中获取目标服务的serviceinfo对象;

基于所述启动服务请求信息和所述目标服务的serviceinfo对象,创建目标服务安装信息。

在基于本发明上述方法的另一个实施例中,所述创建目标服务安装信息之后,还包括:

在所述服务管理组件中保存所述目标服务安装信息。

在基于本发明上述方法的另一个实施例中,所述创建目标服务安装信息之后,还包括:

基于所述目标服务安装信息安装目标服务。

在基于本发明上述方法的另一个实施例中,所述获取所述目标服务安装信息之后,还包括:

根据所述目标服务安装信息,检测在所述服务管理组件中是否保存有目标服务;

若在所述服务管理组件中保存有目标服务,调用所述目标服务的onstartcommand函数;

若在所述服务管理组件中未保存有目标服务,基于所述目标服务安装信息安装目标服务。

在基于本发明上述方法的另一个实施例中,所述基于所述目标服务安装信息安装目标服务,包括:

获取提供目标服务的插件的context对象;

基于所述目标服务安装信息利用提供目标服务的插件的context对象创建目标服务;

初始化所述目标服务。

在基于本发明上述方法的另一个实施例中,所述基于所述目标服务安装信息利用提供目标服务的插件的context对象创建目标服务,包括:

从提供目标服务的插件的context对象获取所述插件的类加载器;

从所述目标服务安装信息获取目标服务的全类名;

基于所述目标服务的全类名,通过反射机制利用所述插件的类加载器获取所述目标服务的系统类对象;

通过反射机制调用所述目标服务的系统类的newinstance来调用构造函数创建目标服务。

在基于本发明上述方法的另一个实施例中,所述初始化所述目标服务,包括:

通过反射机制调用所述目标服务的attachbasecontext的函数;

调用所述目标服务的oncreate函数。

在基于本发明上述方法的另一个实施例中,所述基于所述目标服务安装信息安装目标服务之后,还包括:

在所述服务管理组件中保存所述目标服务。

在基于本发明上述方法的另一个实施例中,所述基于所述目标服务安装信息安装目标服务之后,还包括:

调用所述目标服务的onstartcommand函数。

根据本发明实施例的另一个方面,提供一种启动插件服务的装置,包括:

接收单元,用于通过服务管理组件的binder对象接收客户端的启动服务请求信息;

执行单元,用于根据所述启动服务请求信息启动所述服务管理组件所在的进程中的目标服务;

其中,所述服务管理组件管理其所在的进程中的所有服务,所述服务管理组件与所述客户端运行在不同的进程中。

在基于本发明上述装置的另一个实施例中,所述接收单元,具体用于根据所述启动服务请求信息调用所述服务管理组件的aidl接口对象的startservice函数。

在基于本发明上述装置的另一个实施例中,所述执行单元,具体用于通过所述服务管理组件中继承所述aidl接口的内部类对象访问所述服务管理组件核心类的startservice函数;其中,所述服务管理组件的核心类实现所述aidl接口。

在基于本发明上述装置的另一个实施例中,所述执行单元,包括:

第一检测模块,用于根据所述启动服务请求信息,检测在所述服务管理组件中是否保存有目标服务安装信息;

获取模块,用于根据所述第一检测模块的检测结果,响应于在所述服务管理组件中保存有目标服务安装信息,获取所述目标服务安装信息;

创建模块,用于根据所述第一检测模块的检测结果,响应于在所述服务管理组件中未保存有目标服务安装信息,创建目标服务安装信息。

在基于本发明上述装置的另一个实施例中,所述创建模块,具体用于:

根据所述启动服务请求信息,检测在所述服务管理组件中是否保存有提供目标服务的插件;

若在所述服务管理组件中保存有提供目标服务的插件,从所述插件中获取目标服务的serviceinfo对象;

若在所述服务管理组件中未保存有提供目标服务的插件,从提供目标服务的插件的安装包中获取目标服务的serviceinfo对象;

基于所述启动服务请求信息和所述目标服务的serviceinfo对象,创建目标服务安装信息。

在基于本发明上述装置的另一个实施例中,所述执行单元,还包括:

第一存储模块,用于在所述服务管理组件中保存所述目标服务安装信息。

在基于本发明上述装置的另一个实施例中,所述执行单元,还包括:

安装模块,用于在所述创建模块创建目标服务安装信息之后,基于所述目标服务安装信息安装目标服务。

在基于本发明上述装置的另一个实施例中,所述执行单元,还包括:

第二检测模块,用于根据所述目标服务安装信息,检测在所述服务管理组件中是否保存有目标服务;

执行模块,用于根据所述第二检测模块的检测结果,响应于在所述服务管理组件中保存有目标服务,调用所述目标服务的onstartcommand函数;

所述安装模块,还用于根据所述第二检测模块的检测结果,响应于在所述服务管理组件中未保存有目标服务,基于所述目标服务安装信息安装目标服务。

在基于本发明上述装置的另一个实施例中,所述安装模块,具体用于:

获取提供目标服务的插件的context对象;

基于所述目标服务安装信息利用提供目标服务的插件的context对象创建目标服务;

初始化所述目标服务。

在基于本发明上述装置的另一个实施例中,所述安装模块基于所述目标服务安装信息利用提供目标服务的插件的context对象创建目标服务,具体用于:

从提供目标服务的插件的context对象获取所述插件的类加载器;

从所述目标服务安装信息获取目标服务的全类名;

基于所述目标服务的全类名,通过反射机制利用所述插件的类加载器获取所述目标服务的系统类对象;

通过反射机制调用所述目标服务的系统类的newinstance来调用构造函数创建目标服务。

在基于本发明上述装置的另一个实施例中,所述安装模块初始化所述目标服务,具体用于:

通过反射机制调用所述目标服务的attachbasecontext的函数;

调用所述目标服务的oncreate函数。

在基于本发明上述装置的另一个实施例中,所述执行单元,还包括:

第二存储模块,用于在所述服务管理组件中保存所述目标服务。

在基于本发明上述装置的另一个实施例中,所述执行模块,还用于在所述安装模块基于所述目标服务安装信息安装目标服务之后,调用所述目标服务的onstartcommand函数。

根据本发明实施例的再一个方面,提供的一种终端设备,包括:处理器和存储器;其中,

所述存储器用于存储上述任一实施例所述的启动插件服务的方法的程序;

所述处理器用于执行所述存储器中存储的所述启动插件服务的方法的程序。

基于本发明上述实施例提供的启动插件服务的方法、装置和终端设备,通过为服务端每个进程设置服务管理组件,管理其所在进程中的所有服务,当通过服务管理组件的binder对象接收到客户端的启动服务请求信息后,根据此启动服务请求信息启动服务管理组件所在的进程中的目标服务,当目标服务与客户端运行在不同的进程中时,可以实现对目标服务的启动,由于本发明实施例是通过设置于每一进程中的服务管理组件对进程中的所有服务进行管理,因此其既不需要在主程序的androidmanifest.xml文件中预设服务坑位,也不需要在服务升级时对主程序进行升级的额外处理,即可实现对插件提供的服务的启动。

附图说明

构成说明书的一部分的附图描述了本发明的实施例,并且连同描述一起用于解释本发明的原理。

参照附图,根据下面的详细描述,可以更加清楚地理解本发明,其中:

图1是本发明实施例启动插件服务的方法的一个实施例的流程图。

图2是本发明实施例启动插件服务的方法的另一个实施例的流程图。

图3是本发明实施例启动插件服务的方法的又一个实施例的流程图。

图4是本发明实施例启动插件服务的方法的再一个实施例的流程图。

图5是本发明实施例启动插件服务的装置的一个实施例的结构图。

图6是本发明实施例启动插件服务的装置的另一个实施例的结构图。

图7是本发明实施例启动插件服务的装置的又一个实施例的结构图。

图8是与本发明实施例提供的终端设备相关的手机的部分结构的框图。

具体实施方式

现在将参照附图来详细描述本发明的各种示例性实施例。应注意到:除非另外具体说明,否则在这些实施例中阐述的部件的相对布置、数字表达式和数值不限制本发明的范围。

同时,应当明白,为了便于描述,附图中所示出的各个部分的尺寸并不是按照实际的比例关系绘制的。

以下对至少一个示例性实施例的描述实际上仅仅是说明性的,决不作为对本发明及其应用或使用的任何限制。

对于相关领域普通技术人员已知的技术、方法和设备可能不作详细讨论,但在适当情况下,所述技术、方法和设备应当被视为说明书的一部分。

应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步讨论。

图1是本发明实施例启动插件服务的方法的一个实施例的流程图。如图1所示,该实施例的方法包括:

s102,通过服务管理组件的binder对象接收客户端的启动服务请求信息。

s104,根据启动服务请求信息启动服务管理组件所在的进程中的目标服务。

其中,目标服务为插件提供的服务,例如为android系统的一个后台服务,服务所在的进程通常会在androidmanifest.xml文件中的<service>标签中的android:process中进行指定。客户端为调用服务的一方,实施服务的一方为服务端,例如清理插件要调用备份插件中的备份服务来做清理前的备份,则清理插件的一方为客户端,提供备份服务的一方为服务端,客户端与服务端运行在不同的进程中。在服务端的每一个进程中都设有一个服务管理组件,通过服务管理组件来管理其所在的进程中的所有服务。

在一个具体实施例中,启动服务请求信息可以包括:intent对象、context对象和messenger对象。其中,intent是android系统中对执行一次操作的动作、动作涉及数据和附加数据的描述,android系统根据此intent的描述,负责找到对应的组件,将intent传递给调用的组件,完成组件的调用。context是描述一个应用程序环境的信息,通过context可以获取应用程序的资源和类,也包括一些应用级别操作。messenger是由客户端传递来的用来标记客户端的唯一标识,也可用做与客户端的发送消息服务。

具体实现中,操作s102可以根据启动服务请求信息调用服务管理组件的aidl接口对象的startservice函数,操作s104可以通过服务管理组件中继承aidl接口的内部类对象访问服务管理组件核心类的startservice函数来启动目标服务,其中服务管理组件的核心类实现aidl接口。

在一个具体实施例中,ipluginserviceserver接口对象为服务管理组件的aidl接口对象,ipluginserviceserver接口是服务管理组件的核心接口,pluginserviceserver类是服务管理组件的核心类,是ipluginserviceserver接口的具体实现,服务管理组件通过核心接口与核心类共同实现服务端的服务调度、提供等工作。由于ipluginserviceserver接口对象是binder对象的proxy,因此需要在目标服务所在的进程中实现ipluignserviceserver.stub类,ipluignserviceserver.stub类是pluginserviceserver类的内部类,继承了ipluginserviceserver接口,实现其基础功能,并最终跳转到pluginserviceserver类中进行相应的处理;其中ipluginserviceserver接口声明了startservice函数,内部类ipluignserviceserver.stub定义了startservice函数,pluginserviceserver类实现了startservice函数。

其中,在服务管理组件中实现ipluignserviceserver.stub类,并对其初始化的操作包括:创建或获取pluginserviceserver对象,创建或获取pluginserviceserver.stub对象,及调用pluginserviceserver.stub中的任一方法,跳转到pluginserviceserver。首先,检测在服务管理组件中是否保存有pluginserviceserver对象;若在服务管理组件中保存有pluginserviceserver对象,获取pluginserviceserver对象;否则,若在服务管理组件中未保存有pluginserviceserver对象,创建pluginserviceserver对象;然后,检测在服务管理组件中是否保存有pluginserviceserver.stub对象;若在服务管理组件中保存有pluginserviceserver.stub对象,获取pluginserviceserver.stub对象;否则,若在服务管理组件中未保存有pluginserviceserver.stub对象,创建pluginserviceserver.stub对象;最后,调用pluginserviceserver.stub中的任一方法,跳转到pluginserviceserver。

具体地,创建pluginserviceserver对象可以通过调用ipluginhost接口或ipluginclient接口的fetchserviceserver函数获取ipluginserviceserver接口对象来实现。其具体代码的示例如下:

其中ipluginhost接口为常驻进程的接口,而ipluginclient接口为除常驻进程外其它进程的接口,mservicemgr对象的类为pluginserviceserver,mservicemgr对象通过调用getservice函数获取ipluginserviceserver.stub类。

创建pluginserviceserver.stub对象可以通过调用getservice函数来实现。其具体代码的示例如下:

在一个具体实施例中,startservice函数的具体代码的示例如下:

其中,在该函数中首先复制了一份intent对象,如果客户端和目标服务在同一个进程中,一旦目标服务修改了intent对象,客户端也会对应被修改,这样会出现不可预知的问题,因此需要在函数中首先复制一份intent对象来做各种操作,以防止出现上面的问题。复制intent对象的具体代码的示例如下:

privateintentcloneintentlocked(intentintent){

returnnewintent(intent);

}

然后该函数基于intent对象通过retrieveservicelocked函数来获得servicerecord对象,其中servicerecord对象记录了目标服务的安装信息,其中在获得servicerecord对象的过程中可能会涉及插件信息的获取。之后若目标服务未安装,则通过installserviceifneededlocked函数尝试安装目标服务。最后调用目标服务的onstartcommand函数,以及直接返回目标服务的全类名componentname,表示目标服务已经成功启动。

基于本发明实施例提供的启动插件服务的方法,通过为服务端每个进程设置服务管理组件,管理其所在进程中的所有服务,当通过服务管理组件的binder对象接收到客户端的启动服务请求信息后,根据此启动服务请求信息启动服务管理组件所在的进程中的目标服务,当目标服务与客户端运行在不同的进程中时,可以实现对目标服务的启动,由于本发明实施例是通过设置于每一进程中的服务管理组件对进程中的所有服务进行管理,因此其既不需要在主程序的androidmanifest.xml文件中预设服务坑位,也不需要在服务升级时对主程序进行升级的额外处理,即可实现对插件提供的服务的启动。

图2是本发明实施例启动插件服务的方法的另一个实施例的流程图。如图2所示,该实施例的方法包括:

s202,通过服务管理组件的binder对象接收客户端的启动服务请求信息。

s204,根据启动服务请求信息,检测在服务管理组件中是否保存有目标服务安装信息。

若在服务管理组件中保存有目标服务安装信息,执行操作s206;否者,若在服务管理组件中未保存有目标服务安装信息,执行操作s208。

s206,获取目标服务安装信息。

s208,创建目标服务安装信息。

具体实现中,操作s208可以首先根据启动服务请求信息,检测在服务管理组件中是否保存有提供目标服务的插件,若在服务管理组件中保存有提供目标服务的插件,则从插件中获取目标服务的serviceinfo对象,否则,若在服务管理组件中未保存有提供目标服务的插件,则从提供目标服务的插件的安装包中获取目标服务的serviceinfo对象,最后基于启动服务请求信息和所获得的目标服务的serviceinfo对象,创建目标服务安装信息。

进一步,在操作s208之后,该实施例的启动插件服务的方法还包括:操作s210,基于目标服务安装信息安装目标服务。

具体实现中,在操作s208之后,还可以包括:在服务管理组件中保存目标服务安装信息的操作,以在下一次启动目标服务时可以直接从服务管理组件中获取目标服务安装信息。

在一个具体实施例中,操作s204至操作s208,首先是以目标服务的全类名componentname和启动服务请求信息中的intent对象,在服务管理组件的servicerecord缓存表中寻找与其相匹配的servicerecord对象,其中servicerecord缓存表中记录有服务管理组件所在的进程中所有已安装的服务的安装信息,servicerecord对象为目标服务安装信息,若在服务管理组件的servicerecord缓存表中找到servicerecord对象,获取servicedrecord对象,表示目标服务已经安装,若在服务管理组件的servicerecord缓存表中未找到servicerecord对象,表示目标服务尚未安装,创建servicedrecord对象;然后从目标服务的全类名componentname中获取插件名,通过与插件名对应的插件化框架判断在服务管理组件中是否存在该插件,若在服务管理组件中存在该插件,则可以使用它提供的服务,此时从插件中获取目标服务的serviceinfo对象,例如从插件中预设的componentlist对象中获取目标服务的serviceinfo对象,其中componentlist对象保存有插件的packageinfo对象,若在服务管理组件中不存在该插件,则需要下载该插件,从插件的安装包中获取目标服务的serviceinfo对象;最后基于启动服务请求信息和目标服务的serviceinfo对象创建目标服务的servicerecord对象,并将其保存到servicerecord缓存表和系统的intent.filtercomparison表中,其中intent.filtercomparison表用来进行intent对比。上述操作的具体代码的示例如下:

其中,servicerecord类包括:name,用来记录服务的全类名,以系统的componentname对象来封装,其中componentname对象的key为插件名,value为类全名;plugin,用来记录服务所属的插件的名字,也即为name.getpackagename()的结果,以字符串来表示;classname,用来记录服务的类全名,也即为name.getclassname()的结果,以字符串来表示;intent,用来记录一些服务中的过滤条件,例如action、intentfilter等,以方便之后读取,并做筛选;serviceinfo,用来记录插件的androidmanifest.xml中描述的服务信息,为系统的serviceinfo对象;service,用来记录服务对象,是在服务安装成功后创建的,为核心字段;startrequested,用来记录是否已启动服务,并调用onstartcommand,在解除绑定服务和停止服务时使用。

图3是本发明实施例启动插件服务的方法的又一个实施例的流程图。如图3所示,该实施例的方法包括:

s302,通过服务管理组件的binder对象接收客户端的启动服务请求信息。

s304,根据启动服务请求信息,检测在服务管理组件中是否保存有目标服务安装信息。

若在服务管理组件中保存有目标服务安装信息,执行操作s306;否者,若在服务管理组件中未保存有目标服务安装信息,执行操作s308。

s308,创建目标服务安装信息。

s306,获取目标服务安装信息。

s310,根据目标服务安装信息,检测在服务管理组件中是否保存有目标服务。

若在服务管理组件中保存有目标服务,执行操作314;否则,若在服务管理组件中未保存有目标服务,执行操作s312。

s312,基于目标服务安装信息安装目标服务。

s314,调用目标服务的onstartcommand函数。

进一步,在操作s308之后,还执行操作s312,基于目标服务安装信息安装目标服务的操作。

具体实现中,在操作s308之后,还可以包括:在服务管理组件中保存目标服务安装信息的操作,以在下一次启动目标服务时可以直接从服务管理组件中获取目标服务安装信息。

进一步,在操作s312之后,还执行操作s314,调用目标服务的onstartcommand函数的操作。

具体实现中,在操作s312之后,还可以包括:在服务管理组件中保存目标服务的操作,以在下一次启动目标服务时可以直接从服务管理组件中获取目标服务。

在一个具体实施例中,操作s310至操作s314,首先根据所获得的servicerecord对象判断在服务管理组件中是否存在对应的服务,其中servicerecord缓存表中不仅记录有服务管理组件所在的进程中所有已安装的服务的安装信息,还记录有服务管理组件所在的进程中所有准备安装的服务的安装信息,若在服务管理组件中存在对应的服务,表示之前已经成功安装了该服务,直接调用onstartcommand函数即可,若在服务管理组件中不存在对应的服务,表示之前并未成功安装该服务,需要开始尝试安装该服务。其具体代码的示例如下:

图4是本发明实施例启动插件服务的方法的再一个实施例的流程图。如图4所示,该实施例提供了一种基于目标服务安装信息安装目标服务的方法,该方法包括:

s402,获取提供目标服务的插件的context对象。

s404,基于目标服务安装信息利用提供目标服务的插件的context对象创建目标服务。

s406,初始化目标服务。

具体实现中,操作s404可以包括:从提供目标服务的插件的context对象获取插件的类加载器,从目标服务安装信息获取目标服务的全类名,基于目标服务的全类名,通过反射机制利用插件的类加载器获取目标服务的系统类对象,通过反射机制调用目标服务的系统类的newinstance来调用构造函数创建目标服务。

具体实现中,操作s406可以包括:通过反射机制调用目标服务的attachbasecontext的函数;以及调用目标服务的oncreate函数。

其中,在安装目标服务之后,在服务管理组件中保存目标服务的操作,具体是在服务管理组件中保存初始化后的目标服务,以在下一次启动目标服务时能够直接从服务管理组件中获取初始化后的目标服务。

在一个具体实施例中,操作402至操作406,首先获取提供目标服务的插件的context对象,以通过它来获取classloader对象,以及将其作为目标服务的basecontext,然后从提供目标服务的插件的context对象获取插件的classloader对象,以便通过反射机制来创建目标服务,之后通过反射机制来创建目标服务;其具体包括以下三个步骤:从目标服务的servicerecord对象的serviceinfo中的name字段获取目标服务的全类名,通过反射机制利用插件的classloader对象来获取目标服务的class对象,即系统类对象,再通过反射机制调用目标服务的系统类的newinstance来调用构造函数创建目标服务;之后通过反射机制调用目标服务的attachbasecontext的函数,最后调用目标服务的oncreate函数,实现对目标服务的初始化。其具体代码的示例如下:

其中,attachbasecontext函数的具体代码的示例如下:

在该函数中,参数contextwrapper是目标服务,而目标服务的父类是系统的contextwrapper类,参数context则是之前获取的插件的context对象。

图5是本发明实施例启动插件服务的装置的一个实施例的结构图。如图5所示,该实施例的装置包括:接收单元510和执行单元520。其中:

接收单元510,用于通过服务管理组件的binder对象接收客户端的启动服务请求信息。

执行单元520,用于根据启动服务请求信息启动服务管理组件所在的进程中的目标服务。

其中,服务管理组件管理其所在的进程中的所有服务,服务管理组件与客户端运行在不同的进程中。

具体实现中,接收单元510可以具体用于根据启动服务请求信息调用服务管理组件的aidl接口对象的startservice函数,执行单元520可以具体用于通过服务管理组件中继承所述aidl接口的内部类对象访问服务管理组件核心类的startservice函数来启动目标服务,其中服务管理组件的核心类实现aidl接口。

基于本发明实施例提供的启动插件服务的装置,通过为服务端每个进程设置服务管理组件,管理其所在进程中的所有服务,当通过服务管理组件的binder对象接收到客户端的启动服务请求信息后,根据此启动服务请求信息启动服务管理组件所在的进程中的目标服务,当目标服务与客户端运行在不同的进程中时,可以实现对目标服务的启动,由于本发明实施例是通过设置于每一进程中的服务管理组件对进程中的所有服务进行管理,因此其既不需要在主程序的androidmanifest.xml文件中预设服务坑位,也不需要在服务升级时对主程序进行升级的额外处理,即可实现对插件提供的服务的启动。

图6是本发明实施例启动插件服务的装置的另一个实施例的结构图。如图6所示,与图5的实施例相比,在该实施例中,启动插件服务的装置的执行单元620还包括:第一检测模块621、获取模块622和创建模块623。其中:

第一检测模块621,用于根据启动服务请求信息,检测在服务管理组件中是否保存有目标服务安装信息。

获取模块622,用于根据第一检测模块621的检测结果,响应于在服务管理组件中保存有目标服务安装信息,获取目标服务安装信息。

创建模块623,用于根据第一检测模块621的检测结果,响应于在服务管理组件中未保存有目标服务安装信息,创建目标服务安装信息。

具体实现中,创建模块623可以具体用于:首先根据启动服务请求信息,检测在服务管理组件中是否保存有提供目标服务的插件,若在服务管理组件中保存有提供目标服务的插件,则从插件中获取目标服务的serviceinfo对象,若在服务管理组件中未保存有提供目标服务的插件,则从提供目标服务的插件的安装包中获取目标服务的serviceinfo对象,最后基于启动服务请求信息和所获得的目标服务的serviceinfo对象,创建目标服务安装信息。

进一步,如图6所示,执行单元620还包括:安装模块624,用于在创建模块623创建目标服务安装信息之后,基于目标服务安装信息安装目标服务。

具体实现中,执行单元620还可以包括:第一存储模块,用于在服务管理组件中保存目标服务安装信息,以在下一次启动目标服务时可以直接从服务管理组件中获取目标服务安装信息。

图7是本发明实施例启动插件服务的装置的又一个实施例的结构图。如图7所示,与图6的实施例相比,在该实施例中,启动插件服务的装置的执行单元720还包括:第二检测模块725和执行模块726。其中:

第二检测模块725,用于根据目标服务安装信息,检测在服务管理组件中是否保存有目标服务。

执行模块726,用于根据第二检测模块725的检测结果,响应于在服务管理组件中保存有目标服务,调用目标服务的onstartcommand函数。

安装模块724,还用于根据第二检测模块725的检测结果,响应于在服务管理组件中未保存有目标服务,基于目标服务安装信息安装目标服务。

具体实现中,安装模块724可以具体用于:获取提供目标服务的插件的context对象,基于目标服务安装信息利用提供目标服务的插件的context对象创建目标服务,以及初始化所述目标服务。

具体地,安装模块724基于目标服务安装信息利用提供目标服务的插件的context对象创建目标服务,具体用于:从提供目标服务的插件的context对象获取插件的类加载器,从目标服务安装信息获取目标服务的全类名,基于目标服务的全类名,通过反射机制利用插件的类加载器获取目标服务的系统类对象,通过反射机制调用目标服务的系统类的newinstance来调用构造函数创建目标服务。

具体地,安装模块724初始化目标服务,具体用于:通过反射机制调用目标服务的attachbasecontext的函数,以及调用目标服务的oncreate函数。

进一步,执行单元720还包括:第二存储模块,用于在服务管理组件中保存目标服务,以在下一次启动目标服务时可以直接从服务管理组件中获取目标服务。

具体地,在安装模块724初始化目标服务之后,第二存储模块用于保存初始化后的目标服务,以在下一次启动目标服务时能够直接从服务管理组件中获取初始化后的目标服务。

进一步,执行模块726,还用于在安装模块724基于目标服务安装信息安装目标服务之后,调用目标服务的onstartcommand函数。

另外,本发明实施例还提供了终端设备,如图8所示,为了便于说明,仅示出了与本发明实施例相关的部分,具体技术细节未揭示的,请参照本发明实施例方法部分。该终端设备可以为包括手机、平板电脑、pda(personaldigitalassistant,个人数字助理)、pos(pointofsales,销售终端)、车载电脑等任意终端设备,以终端设备为手机为例:

图8是与本发明实施例提供的终端设备相关的手机的部分结构的框图。参考图8,手机包括:射频(radiofrequency,rf)电路810、存储器820、输入单元830、显示单元840、传感器850、音频电路860、无线保真(wireless-fidelity,wi-fi)模块870、处理器880、以及电源890等部件。本领域技术人员可以理解,图8中示出的手机结构并不构成对手机的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。

下面结合图8对手机的各个构成部件进行具体的介绍:

rf电路810可用于收发信息或通话过程中,信号的接收和发送,特别地,将基站的下行信息接收后,给处理器880处理;另外,将设计上行的数据发送给基站。通常,rf电路810包括但不限于天线、至少一个放大器、收发信机、耦合器、低噪声放大器(lownoiseamplifier,lna)、双工器等。此外,rf电路810还可以通过无线通信与网络和其他设备通信。上述无线通信可以使用任一通信标准或协议,包括但不限于全球移动通讯系统(globalsystemofmobilecommunication,gsm)、通用分组无线服务(generalpacketradioservice,gprs)、码分多址(codedivisionmultipleaccess,cdma)、宽带码分多址(widebandcodedivisionmultipleaccess,wcdma)、长期演进(longtermevolution,lte)、电子邮件、短消息服务(shortmessagingservice,sms)等。

存储器820可用于存储软件程序以及模块,处理器880通过运行存储在存储器820的软件程序以及模块,从而执行手机的各种功能应用以及数据处理。存储器820可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器820可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。

输入单元830可用于接收输入的数字或字符信息,以及产生与手机的用户设置以及功能控制有关的键信号输入。具体地,输入单元830可包括触控面板831以及其他输入设备832。触控面板831,也称为触摸屏,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触控面板831上或在触控面板831附近的操作),并根据预先设定的程式驱动相应的连接装置。可选的,触控面板831可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器880,并能接收处理器880发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触控面板831。除了触控面板831,输入单元830还可以包括其他输入设备832。具体地,其他输入设备832可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。

显示单元840可用于显示由用户输入的信息或提供给用户的信息以及手机的各种菜单。显示单元840可包括显示面板841,可选的,可以采用液晶显示器(liquidcrystaldisplay,lcd)、有机发光二极管(organiclight-emittingdiode,oled)等形式来配置显示面板841。进一步的,触控面板831可覆盖显示面板841,当触控面板831检测到在其上或附近的触摸操作后,传送给处理器880以确定触摸事件的类型,随后处理器880根据触摸事件的类型在显示面板841上提供相应的视觉输出。虽然在图8中,触控面板831与显示面板841是作为两个独立的部件来实现手机的输入和输入功能,但是在某些实施例中,可以将触控面板831与显示面板841集成而实现手机的输入和输出功能。

手机还可包括至少一种传感器850,比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板841的亮度,接近传感器可在手机移动到耳边时,关闭显示面板841和/或背光。作为运动传感器的一种,加速计传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别手机姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;至于手机还可配置的陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。

音频电路860、扬声器861,传声器862可提供用户与手机之间的音频接口。音频电路860可将接收到的音频数据转换后的电信号,传输到扬声器861,由扬声器861转换为声音信号输出;另一方面,传声器862将收集的声音信号转换为电信号,由音频电路860接收后转换为音频数据,再将音频数据输出处理器880处理后,经rf电路810以发送给比如另一手机,或者将音频数据输出至存储器820以便进一步处理。

wifi属于短距离无线传输技术,手机通过wifi模块870可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图8示出了wifi模块870,但是可以理解的是,其并不属于手机的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。

处理器880是手机的控制中心,利用各种接口和线路连接整个手机的各个部分,通过运行或执行存储在存储器820内的软件程序和/或模块,以及调用存储在存储器820内的数据,执行手机的各种功能和处理数据,从而对手机进行整体监控。可选的,处理器880可包括一个或多个处理单元;优选的,处理器880可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器880中。

手机还包括给各个部件供电的电源890(比如电池),优选的,电源可以通过电源管理系统与处理器880逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。

尽管未示出,手机还可以包括摄像头、蓝牙模块等,在此不再赘述。

在本发明实施例中,该终端设备所包括的处理器880还具有以下功能:

通过服务管理组件的binder对象接收客户端的启动服务请求信息;

根据启动服务请求信息启动服务管理组件所在的进程中的目标服务;

其中,服务管理组件管理其所在的进程中的所有服务,服务管理组件与客户端运行在不同的进程中。

本发明实施例提供了以下技术方案:

1、一种启动插件服务的方法,包括:

通过服务管理组件的binder对象接收客户端的启动服务请求信息;

根据所述启动服务请求信息启动所述服务管理组件所在的进程中的目标服务;

其中,所述服务管理组件管理其所在的进程中的所有服务,所述服务管理组件与所述客户端运行在不同的进程中。

2、根据1所述的方法,所述通过服务管理组件的binder对象接收客户端的启动服务请求信息,包括:

根据所述启动服务请求信息调用所述服务管理组件的aidl接口对象的startservice函数。

3、根据2所述的方法,所述根据所述启动服务请求信息启动所述服务管理组件所在的进程中的目标服务,包括:

通过所述服务管理组件中继承所述aidl接口的内部类对象访问所述服务管理组件核心类的startservice函数;其中所述服务管理组件的核心类实现所述aidl接口。

4、根据1至3任意一项所述的方法,所述根据所述启动服务请求信息启动所述服务管理组件所在的进程中的目标服务,包括:

根据所述启动服务请求信息,检测在所述服务管理组件中是否保存有目标服务安装信息;

若在所述服务管理组件中保存有目标服务安装信息,获取所述目标服务安装信息;

若在所述服务管理组件中未保存有目标服务安装信息,创建目标服务安装信息。

5、根据4所述的方法,所述创建目标服务安装信息,包括:

根据所述启动服务请求信息,检测在所述服务管理组件中是否保存有提供目标服务的插件;

若在所述服务管理组件中保存有提供目标服务的插件,从所述插件中获取目标服务的serviceinfo对象;

若在所述服务管理组件中未保存有提供目标服务的插件,从提供目标服务的插件的安装包中获取目标服务的serviceinfo对象;

基于所述启动服务请求信息和所述目标服务的serviceinfo对象,创建目标服务安装信息。

6、根据4或5所述的方法,所述创建目标服务安装信息之后,还包括:

在所述服务管理组件中保存所述目标服务安装信息。

7、根据4至6任意一项所述的方法,所述创建目标服务安装信息之后,还包括:

基于所述目标服务安装信息安装目标服务。

8、根据7所述的方法,所述获取所述目标服务安装信息之后,还包括:

根据所述目标服务安装信息,检测在所述服务管理组件中是否保存有目标服务;

若在所述服务管理组件中保存有目标服务,调用所述目标服务的onstartcommand函数;

若在所述服务管理组件中未保存有目标服务,基于所述目标服务安装信息安装目标服务。

9、根据7或8所述的方法,所述基于所述目标服务安装信息安装目标服务,包括:

获取提供目标服务的插件的context对象;

基于所述目标服务安装信息利用提供目标服务的插件的context对象创建目标服务;

初始化所述目标服务。

10、根据9所述的方法,所述基于所述目标服务安装信息利用提供目标服务的插件的context对象创建目标服务,包括:

从提供目标服务的插件的context对象获取所述插件的类加载器;

从所述目标服务安装信息获取目标服务的全类名;

基于所述目标服务的全类名,通过反射机制利用所述插件的类加载器获取所述目标服务的系统类对象;

通过反射机制调用所述目标服务的系统类的newinstance来调用构造函数创建目标服务。

11、根据9所述的方法,所述初始化所述目标服务,包括:

通过反射机制调用所述目标服务的attachbasecontext的函数;

调用所述目标服务的oncreate函数。

12、根据8至11任意一项所述的方法,所述基于所述目标服务安装信息安装目标服务之后,还包括:

在所述服务管理组件中保存所述目标服务。

13、根据8至12任意一项所述的方法,所述基于所述目标服务安装信息安装目标服务之后,还包括:

调用所述目标服务的onstartcommand函数。

14、一种启动插件服务的装置,包括:

接收单元,用于通过服务管理组件的binder对象接收客户端的启动服务请求信息;

执行单元,用于根据所述启动服务请求信息启动所述服务管理组件所在的进程中的目标服务;

其中,所述服务管理组件管理其所在的进程中的所有服务,所述服务管理组件与所述客户端运行在不同的进程中。

15、根据14所述的装置,所述接收单元,具体用于根据所述启动服务请求信息调用所述服务管理组件的aidl接口对象的startservice函数。

16、根据15所述的装置,所述执行单元,具体用于通过所述服务管理组件中继承所述aidl接口的内部类对象访问所述服务管理组件核心类的startservice函数;其中,所述服务管理组件的核心类实现所述aidl接口。

17、根据16所述的装置,所述执行单元,包括:

第一检测模块,用于根据所述启动服务请求信息,检测在所述服务管理组件中是否保存有目标服务安装信息;

获取模块,用于根据所述第一检测模块的检测结果,响应于在所述服务管理组件中保存有目标服务安装信息,获取所述目标服务安装信息;

创建模块,用于根据所述第一检测模块的检测结果,响应于在所述服务管理组件中未保存有目标服务安装信息,创建目标服务安装信息。

18、根据17所述的装置,所述创建模块,具体用于:

根据所述启动服务请求信息,检测在所述服务管理组件中是否保存有提供目标服务的插件;

若在所述服务管理组件中保存有提供目标服务的插件,从所述插件中获取目标服务的serviceinfo对象;

若在所述服务管理组件中未保存有提供目标服务的插件,从提供目标服务的插件的安装包中获取目标服务的serviceinfo对象;

基于所述启动服务请求信息和所述目标服务的serviceinfo对象,创建目标服务安装信息。

19、根据17或18所述的装置,所述执行单元,还包括:

第一存储模块,用于在所述服务管理组件中保存所述目标服务安装信息。

20、根据17至19任意一项所述的装置,所述执行单元,还包括:

安装模块,用于在所述创建模块创建目标服务安装信息之后,基于所述目标服务安装信息安装目标服务。

21、根据20所述的装置,所述执行单元,还包括:

第二检测模块,用于根据所述目标服务安装信息,检测在所述服务管理组件中是否保存有目标服务;

执行模块,用于根据所述第二检测模块的检测结果,响应于在所述服务管理组件中保存有目标服务,调用所述目标服务的onstartcommand函数;

所述安装模块,还用于根据所述第二检测模块的检测结果,响应于在所述服务管理组件中未保存有目标服务,基于所述目标服务安装信息安装目标服务。

22、根据20或21所述的装置,所述安装模块,具体用于:

获取提供目标服务的插件的context对象;

基于所述目标服务安装信息利用提供目标服务的插件的context对象创建目标服务;

初始化所述目标服务。

23、根据22所述的装置,所述安装模块基于所述目标服务安装信息利用提供目标服务的插件的context对象创建目标服务,具体用于:

从提供目标服务的插件的context对象获取所述插件的类加载器;

从所述目标服务安装信息获取目标服务的全类名;

基于所述目标服务的全类名,通过反射机制利用所述插件的类加载器获取所述目标服务的系统类对象;

通过反射机制调用所述目标服务的系统类的newinstance来调用构造函数创建目标服务。

24、根据22所述的装置,所述安装模块初始化所述目标服务,具体用于:

通过反射机制调用所述目标服务的attachbasecontext的函数;

调用所述目标服务的oncreate函数。

25、根据21至24任意一项所述的装置,所述执行单元,还包括:

第二存储模块,用于在所述服务管理组件中保存所述目标服务。

26、根据21至25任意一项所述的装置,所述执行模块,还用于在所述安装模块基于所述目标服务安装信息安装目标服务之后,调用所述目标服务的onstartcommand函数。

27、一种终端设备,包括:处理器和存储器;其中,

所述存储器用于存储1至13任意一项所述的启动插件服务的方法;

所述处理器用于执行所述启动插件服务的方法。

本说明书中各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似的部分相互参见即可。对于系统实施例而言,由于其与方法实施例基本对应,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

可能以许多方式来实现本发明的方法和装置、设备。例如,可通过软件、硬件、固件或者软件、硬件、固件的任何组合来实现本发明的方法和装置、设备。用于所述方法的步骤的上述顺序仅是为了进行说明,本发明的方法的步骤不限于以上具体描述的顺序,除非以其它方式特别说明。此外,在一些实施例中,还可将本发明实施为记录在记录介质中的程序,这些程序包括用于实现根据本发明的方法的机器可读指令。因而,本发明还覆盖存储用于执行根据本发明的方法的程序的记录介质。

本发明的描述是为了示例和描述起见而给出的,而并不是无遗漏的或者将本发明限于所公开的形式。很多修改和变化对于本领域的普通技术人员而言是显然的。选择和描述实施例是为了更好说明本发明的原理和实际应用,并且使本领域的普通技术人员能够理解本发明从而设计适于特定用途的带有各种修改的各种实施例。

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