CN106775888A - 基于一个Service启动多个Service的方法和装置 - Google Patents

基于一个Service启动多个Service的方法和装置 Download PDF

Info

Publication number
CN106775888A
CN106775888A CN201611235690.4A CN201611235690A CN106775888A CN 106775888 A CN106775888 A CN 106775888A CN 201611235690 A CN201611235690 A CN 201611235690A CN 106775888 A CN106775888 A CN 106775888A
Authority
CN
China
Prior art keywords
target service
service
request
behalf
startup
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN201611235690.4A
Other languages
English (en)
Inventor
王云鹏
刘刚
任太胜
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Qihoo Technology Co Ltd
Original Assignee
Beijing Qihoo Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Qihoo Technology Co Ltd filed Critical Beijing Qihoo Technology Co Ltd
Priority to CN201611235690.4A priority Critical patent/CN106775888A/zh
Publication of CN106775888A publication Critical patent/CN106775888A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明提供了基于一个Service启动多个Service的方法和装置,该方法包括:当监测到向应用程序的任一进程的多个目标Service中的任一个目标Service发送的原始启动请求时,拦截并获取该原始启动请求;将该原始启动请求中的请求启动的目标Service的名称修改为与进程对应的代理Service的名称,并基于修改后的启动请求,启动代理Service;基于原始启动请求,通过已启动的代理Service启动目标Service。本技术方案通过一个代理Service启动分身应用程序中一个进程中的所有目标Service;避免了安卓系统访问配置文件信息失败的情况发生。

Description

基于一个Service启动多个Service的方法和装置
技术领域
本发明涉及计算机领域,具体而言,本发明涉及一种基于一个Service启动多个Service的方法和一种基于一个Service启动多个Service的装置。
背景技术
随着信息技术的发展,移动终端也从传统的数字移动终端发展到了智能移动终端。由于智能移动终端不但实现了传统的数字移动终端的所有功能,还通过安装多种应用程序来满足用户的各种需求,如娱乐需求、学习需求、购物需求、办公需求等。特别是,用于满足用户社交需求的社交应用程序。
用户通过社交应用程序和互联网、能够无时无刻与家人、朋友和同事保持联系;用户为了保证自己的生活隐私不被泄露,会在社交应用程序中注册多个社交账号,并基于不同的社交用途,灵活使用各个社交账号。然而,随着同一个社交应用程序的社交账号的增多,用户在登录安装于移动终端上的同一个社交应用程序的不同账号时,存在账号切换问题,给用户带来了无法在同一时间登录安装于移动终端上的该同一个社交应用程序的不同账号的不良用户体验。
为了解决上述问题,应用程序开发人员开发了一款可以对原生应用程序进行分身的应用程序,用户通过该应用程序可以实现同时登陆同一社交应用程序的多个社交账号。但由于开发人员并不能确定用户会通过该应用程序来对哪一个原生应用程序进行分身,所以无法对该应用程序的配置文件信息中的注册信息进行设置,尤其是,无法对Service组件的注册信息进行设置,且即使开发人员在该应用程序的配置文件信息中设置Service组件的注册信息,该Service组件的注册信息数量也会非常庞大;当智能移动终端的操作系统在访问该庞大数量的Service组件的注册信息时,会大大增加了操作系统崩溃的机率。故如何保证智能移动终端的操作系统稳定地访问Service组件的注册信息且维持该Service组件的稳定运行,是解决上述问题的关键。
发明内容
为克服上述技术问题或者至少部分地解决上述技术问题,特提出以下技术方案:
本发明的一个实施例提出了一种基于一个Service启动多个Service的方法,包括:
当监测到向应用程序的任一进程的多个目标Service中的任一个目标Service发送的原始启动请求时,拦截并获取该原始启动请求;
将该原始启动请求中的请求启动的目标Service的名称修改为与进程对应的代理Service的名称,并基于修改后的启动请求,启动代理Service;
基于原始启动请求,通过已启动的代理Service启动目标Service。
优选地,该方法还包括:
在manifest配置文件中预注册至少一个代理Service的注册信息;
其中,基于修改后的启动请求,启动代理Service的步骤,包括:
基于该修改后的启动请求和代理Service的注册信息,通过Android系统启动代理Service。
优选地,当原始启动请求为目标Service启动请求,该方法还包括:
返回响应于该目标Service启动请求的目标Service启动的标识信息;
当监测到向目标Service发送的停止请求时,拦截并获取该停止请求中的目标Service启动的标识信息;
当获取到针对目标Service的所有目标Service启动的标识信息,则停止目标Service。
优选地,当原始启动请求为目标Service绑定启动请求时,该方法还包括:
获取已启动的目标Service返回的调用对象,并将该调用对象作为响应于目标Service绑定启动请求的返回信息;
当再获取到针对已启动的目标Service的目标Service绑定启动请求时,直接将已接收到的该调用对象作为响应绑定启动请求的返回信息。
优选地,获取已启动的目标Service返回的调用对象,包括:
基于接收到的Intent通信信息,获取已启动的目标Service返回的调用对象;
其中,将该调用对象作为响应目标Service绑定启动请求的返回信息的步骤,具体包括:
获取Intent通信信息中的intent哈希码,基于Intent通信信息中的intent哈希码所对应的组件标识信息,确定该调用对象所属的已启动的目标Service;
基于该调用对象所属的已启动的目标Service和目标Service绑定启动请求,将该调用对象作为响应目标Service绑定启动请求的返回信息。
优选地,当原始启动请求为目标Service绑定启动请求时,该方法还包括:
返回响应该目标Service绑定启动请求的目标Service绑定启动的标识信息;
当监测到向目标Service发送的目标Service绑定停止请求时,拦截并获取该目标Service绑定停止请求中的目标Service绑定启动的标识信息;
当获取到针对目标Service的所有目标Service绑定启动的标识信息,则停止Service。
优选地,基于原始启动请求,通过已启动的代理Service启动目标Service的步骤,具体包括:
基于原始启动请求中的请求启动的目标Service的标识信息,通过已启动的代理Service加载该目标Service;
创建目标Service的对象;
基于目标Service的对象,通过已启动的代理Service向目标Service发送执行通知,从而启动目标Service。
其中,原始启动请求包括以下任一项:
目标Service启动请求、目标Service绑定启动请求。
本发明的另一个实施例提出了一种基于一个Service启动多个Service的装置,包括:
第一监测模块,用于当监测到向应用程序的任一进程的多个目标Service中的任一个目标Service发送的原始启动请求时,拦截并获取该原始启动请求;
第一启动模块,用于将该原始启动请求中的请求启动的目标Service的名称修改为与进程对应的代理Service的名称,并基于修改后的启动请求,启动代理Service;
第二启动模块,用于基于原始启动请求,通过已启动的代理Service启动目标Service。
优选地,该装置还包括:
注册模块,用于在manifest配置文件中预注册至少一个代理Service的注册信息;
其中,第一启动模块用于基于该修改后的启动请求和代理Service的注册信息,通过Android系统启动代理Service。
优选地,当原始启动请求为目标Service启动请求,该装置还包括:
第一返回模块,用于返回响应于该目标Service启动请求的目标Service启动的标识信息;
第二监测模块,用于当监测到向目标Service发送的停止请求时,拦截并获取该停止请求中的目标Service启动的标识信息;
第一停止模块,用于当获取到针对目标Service的所有目标Service启动的标识信息,则停止目标Service。
优选地,当原始启动请求为目标Service绑定启动请求时,装置还包括:
获取模块,用于获取已启动的目标Service返回的调用对象,并将该调用对象作为响应于目标Service绑定启动请求的返回信息;
第二返回模块,用于当再获取到针对已启动的目标Service的目标Service绑定启动请求时,直接将已接收到的该调用对象作为响应绑定启动请求的返回信息。
优选地,获取模块包括:
调用对象获取单元,用于基于接收到的Intent通信信息,获取已启动的目标Service返回的调用对象;
确定单元,用于获取Intent通信信息中的intent哈希码,基于Intent通信信息中的intent哈希码所对应的组件标识信息,确定该调用对象所属的已启动的目标Service;
返回单元,用于基于该调用对象所属的已启动的目标Service和目标Service绑定启动请求,将该调用对象作为响应目标Service绑定启动请求的返回信息。
优选地,当原始启动请求为目标Service绑定启动请求时,该装置还包括:
第三返回模块,用于返回响应该目标Service绑定启动请求的目标Service绑定启动的标识信息;
第三监测模块,用于当监测到向目标Service发送的目标Service绑定停止请求时,拦截并获取该目标Service绑定停止请求中的目标Service绑定启动的标识信息;
第二停止模块,用于当获取到针对目标Service的所有目标Service绑定启动的标识信息,则停止Service。
优选地,第二启动模块包括:
加载单元,用于基于原始启动请求中的请求启动的目标Service的标识信息,通过已启动的代理Service加载该目标Service;
创建单元,用于创建目标Service的对象;
执行单元,用于基于目标Service的对象,通过已启动的代理Service向目标Service发送执行通知,从而启动目标Service。
其中,原始启动请求包括以下任一项:
目标Service启动请求、目标Service绑定启动请求。
本发明的技术方案中,当监测到向应用程序的任一进程的多个目标Service中的任一个目标Service发送的原始启动请求时,拦截并获取该原始启动请求;将该原始启动请求中的请求启动的目标Service的名称修改为与进程对应的代理Service的名称,并启动代理Service;从而通过已启动的代理Service启动目标Service;使得开发人员无需在开发的应用程序的配置文件信息中对所有需要启动的目标Service进行注册,只需要对预置数量的代理Service进行注册,就可以通过一个代理Service启动分身应用程序中一个进程中的所有目标Service;同时,避免了Android系统访问该配置文件信息时,由于目标Service注册信息数量庞大,导致Android系统的访问失败,甚至是Android系统的崩溃的情况发生;大大提升了Android系统访问该配置文件信息的稳定度;进一步,为分身应用程序的稳定运行提供了基础;同时,也为用户提供了良好地使用分身应用程序的体验。
本发明附加的方面和优点将在下面的描述中部分给出,这些将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:
图1为本发明一个实施例的基于一个Service启动多个Service的方法的流程示意图;
图2为本发明中的一个优选实施例的基于目标Service启动请求启动的目标Service的停止步骤的流程示意图;
图3为本发明中的另一个优选实施例的获取调用对象步骤的流程示意图;
图4为本发明中的又一个优选实施例的启动目标Service步骤的流程示意图;
图5为本发明中的另一个实施例的基于一个Service启动多个Service的装置的结构框架示意图;
图6为本发明中的一个优选实施例的获取模块的结构框架示意图;
图7为本发明中的另一个优选实施例的第二启动模块的结构框架示意图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一单元和全部组合。
本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。
图1为本发明一个实施例的基于一个Service启动多个Service的方法的流程示意图。
需要说明的是,本实施例的执行主体是应用程序。
步骤S101:当监测到向应用程序的任一进程的多个目标Service中的任一个目标Service发送的原始启动请求时,拦截并获取该原始启动请求;步骤S102:将该原始启动请求中的请求启动的目标Service的名称修改为与进程对应的代理Service的名称,并基于修改后的启动请求,启动代理Service;步骤S103:基于原始启动请求,通过已启动的代理Service启动目标Service。
本发明的技术方案中,当监测到向应用程序的任一进程的多个目标Service中的任一个目标Service发送的原始启动请求时,拦截并获取该原始启动请求;将该原始启动请求中的请求启动的目标Service的名称修改为与进程对应的代理Service的名称,并启动代理Service;从而通过已启动的代理Service启动目标Service;使得开发人员无需在开发的应用程序的配置文件信息中对所有需要启动的目标Service进行注册,只需要对预置数量的代理Service进行注册,就可以通过一个代理Service启动分身应用程序中一个进程中的所有目标Service;同时,避免了Android系统访问该配置文件信息时,由于目标Service注册信息数量庞大,导致Android系统的访问失败,甚至是Android系统的崩溃的情况发生;大大提升了Android系统访问该配置文件信息的稳定度;进一步,为分身应用程序的稳定运行提供了基础;同时,也为用户提供了良好地使用分身应用程序的体验。
以下针对各个步骤的具体实现做进一步的说明:
步骤S101:当监测到向应用程序的任一进程的多个目标Service中的任一个目标Service发送的原始启动请求时,拦截并获取该原始启动请求。
其中,原始启动请求包括以下任一项:目标Service启动请求、目标Service绑定启动请求。
具体地,通过钩子函数监测向应用程序的任一进程的多个目标Service中的任一个目标Service发送的原始启动请求,当监测到向应用程序的任一进程的多个目标Service中的任一个目标Service发送的原始启动请求时,如,监测到“微信”分身应用程序的“朋友圈”界面的Activity向“微信”分身应用程序的一个进程中的“播放音乐”目标Service,发送目标Service启动请求,钩子函数拦截并获取该“播放音乐”目标Service启动请求。
步骤S102:将该原始启动请求中的请求启动的目标Service的名称修改为与进程对应的代理Service的名称,并基于修改后的启动请求,启动代理Service。
具体地,该方法还包括:在manifest配置文件中预注册至少一个代理Service的注册信息。其中,注册信息包括但不限于:代理Service名称的注册信息、代理Service所属的进程的注册信息。
其中,基于修改后的启动请求,启动代理Service的步骤,包括:基于该修改后的启动请求和代理Service的注册信息,通过Android系统启动代理Service。
例如,将拦截到的该目标Service启动请求中的请求启动的“播放音乐”目标Service的名称“播放音乐”修改为代理Service1的名称,如“ProxyService1”;Android系统基于将该修改后的启动请求和代理Service1的注册信息,启动该代理Service1。
需要说明的是,在应用程序的manifest配置文件中,根据需要可以注册多个代理Service,每个代理Service随意代理任一分身应用程序的任一进程中的所有Service。
步骤S103:基于原始启动请求,通过已启动的代理Service启动目标Service。
具体地,基于原始启动请求,通过已启动的代理Service启动目标Service的步骤,如图4所述,具体包括:步骤S401:基于原始启动请求中的请求启动的目标Service的标识信息,通过已启动的代理Service加载该目标Service;步骤S402:创建目标Service的对象;步骤S403:基于目标Service的对象,通过已启动的代理Service向目标Service发送执行通知,从而启动目标Service。
例如,基于该“播放音乐”目标Service启动请求中的请求启动的目标Service的名称“播放音乐”,已启动的代理Service1通过类加载器ClassLoader加载该“播放音乐”目标Service;通过反射机制和handleCreateService方法,创建出“播放音乐”目标Service的Java对象和该“播放音乐”目标Service对应的Context,基于该创建出“播放音乐”目标Service的Java对象、该“播放音乐”目标Service对应的Context,已启动的代理Service1向目标Service发送执行通知intent通信信息,从而启动“播放音乐”目标Service。
具体地,当原始启动请求为目标Service启动请求,该方法还包括:如图2所示:步骤S201:返回响应于该目标Service启动请求的目标Service启动的标识信息;步骤S202:当监测到向目标Service发送的停止请求时,拦截并获取该停止请求中的目标Service启动的标识信息;步骤S203:当获取到针对目标Service的所有目标Service启动的标识信息,则停止目标Service。
例如,当原始启动请求为目标Service启动请求:“播放音乐”目标Service启动请求,通过已启动代理Service1启动“播放音乐”目标Service后,基于该“播放音乐”目标Service已经启动的次数设置目标Service启动的标识信息,如,该“播放音乐”目标Service已经第三次启动,则将该“播放音乐”目标Service启动的标识信息设置为“3”,并返回响应于该“播放音乐”目标Service启动请求的将该“播放音乐”目标Service启动的标识信息“3”至启动者,如“朋友圈”界面的Activity,当钩子函数监测到“朋友圈”界面的Activity向“播放音乐”目标Service发送停止请求时,拦截并获取该停止请求中的“播放音乐”目标Service启动的标识信息“3”;由于“播放音乐”目标Service已经第三次启动,说明还返回过“播放音乐”目标Service启动的标识信息“1”和“2”至其他Android系统组件或者启动者,若未获取到该“播放音乐”目标Service启动的标识信息“1”和“2”,则不停止该“播放音乐”目标Service;若已获取到该“播放音乐”目标Service启动的标识信息“1”和“2”,则停止该“播放音乐”目标Service;从而避免该目标Service的误停,导致其他Android系统组件或者启动者无法继续使用该目标Service。
具体地,当原始启动请求为目标Service绑定启动请求时,该方法还包括:如图3所示,步骤S301:获取已启动的目标Service返回的调用对象,并将该调用对象作为响应于目标Service绑定启动请求的返回信息;步骤S302:当再获取到针对已启动的目标Service的目标Service绑定启动请求时,直接将已接收到的该调用对象作为响应绑定启动请求的返回信息。
更具体地,获取已启动的目标Service返回的调用对象,包括:基于接收到的Intent通信信息,获取已启动的目标Service返回的调用对象;其中,将该调用对象作为响应目标Service绑定启动请求的返回信息的步骤,具体包括:获取Intent通信信息中的intent哈希码,基于Intent通信信息中的intent哈希码所对应的组件标识信息,确定该调用对象所属的已启动的目标Service;基于该调用对象所属的已启动的目标Service和目标Service绑定启动请求,将该调用对象作为响应目标Service绑定启动请求的返回信息。
例如,当通过钩子函数监测到“腾讯QQ”分身应用程序的“音乐播放器”界面的Activity向“腾讯QQ”分身应用程序的一个进程中的“操作音乐播放器”目标Service,发送目标Service绑定启动请求:“操作音乐播放器”目标Service绑定启动请求时,并通过已启动的代理Service2启动“操作音乐播放器”目标Service后,基于接收到由“操作音乐播放器”目标Service发送的intent通信信息,获取该intent通信信息中的已启动的“操作音乐播放器”目标Service返回的调用对象binder;基于intent通信信息中用于描述该intent通信信息的各种属性,如,action,category等,的Intent Filter中的int filter Hash Code方法生成的intent哈希码,确定该哈希码所对应的目标Service的名称,即Componentname;从而确定该调用对象binder所属的已启动的目标Service为:“操作音乐播放器”目标Service,基于该调用对象binder所属的已启动的“操作音乐播放器”目标Service和该目标Service绑定启动请求中的请求启动对象,将该调用对象binder与目标Service绑定启动请求进行匹配,从而将该调用对象binder作为响应该目标Service绑定启动请求的返回信息;以保证所有各个调用对象都能正确地返回给对应的Android系统组件或启动者,并使得Android系统组件或启动者能够顺利地与目标Service进行交互。当再获取到针对已启动的“操作音乐播放器”目标Service的目标Service绑定启动请求时,直接将已接收到的该调用对象binder作为响应绑定启动请求的返回信息。
具体地,当原始启动请求为目标Service绑定启动请求时,该方法还包括:返回响应该目标Service绑定启动请求的目标Service绑定启动的标识信息;当监测到向目标Service发送的目标Service绑定停止请求时,拦截并获取该目标Service绑定停止请求中的目标Service绑定启动的标识信息;当获取到针对目标Service的所有目标Service绑定启动的标识信息,则停止Service。
例如,当原始启动请求为目标Service绑定启动请求:“操作音乐播放器”目标Service绑定启动请求时,通过已启动代理Service2启动“操作音乐播放器”目标Service后,基于该“操作音乐播放器”目标Service已经启动的次数设置目标Service绑定启动的标识信息,如,该“操作音乐播放器”目标Service已经第三次启动,则将该“操作音乐播放器”目标Service绑定启动的标识信息设置为“03”,并返回响应于该“操作音乐播放器”目标Service绑定启动请求的将该“操作音乐播放器”目标Service启动的标识信息“03”至启动者,如“音乐播放器”界面的Activity,当钩子函数监测到“音乐播放器”界面的Activity向“操作音乐播放器”目标Service发送停止请求时,拦截并获取该停止请求中的“操作音乐播放器”目标Service启动的标识信息“03”;由于“操作音乐播放器”目标Service已经第三次启动,说明还返回过“操作音乐播放器”目标Service启动的标识信息“01”和“02”至其他Android系统组件或者启动者,若未获取到该“操作音乐播放器”目标Service启动的标识信息“01”和“02”,则不停止该“操作音乐播放器”目标Service;若已获取到该“操作音乐播放器”目标Service启动的标识信息“01”和“02”,则停止该“操作音乐播放器”目标Service;从而避免目标Service的误停,导致其他Android系统组件或者启动者无法继续使用该目标Service。
图5为本发明中的另一个实施例的基于一个Service启动多个Service的装置的结构框架示意图。
第一监测模块501,当监测到向应用程序的任一进程的多个目标Service中的任一个目标Service发送的原始启动请求时,拦截并获取该原始启动请求;第一启动模块502,将该原始启动请求中的请求启动的目标Service的名称修改为与进程对应的代理Service的名称,并基于修改后的启动请求,启动代理Service;第二启动模块503,基于原始启动请求,通过已启动的代理Service启动目标Service。
以下针对各个模块的具体实现做进一步的说明:
第一监测模块501,当监测到向应用程序的任一进程的多个目标Service中的任一个目标Service发送的原始启动请求时,拦截并获取该原始启动请求。
其中,原始启动请求包括以下任一项:目标Service启动请求、目标Service绑定启动请求。
具体地,第一监测模块501,通过钩子函数监测向应用程序的任一进程的多个目标Service中的任一个目标Service发送的原始启动请求,当监测到向应用程序的任一进程的多个目标Service中的任一个目标Service发送的原始启动请求时,如,监测到“微信”分身应用程序的“朋友圈”界面的Activity向“微信”分身应用程序的一个进程中的“播放音乐”目标Service,发送目标Service启动请求,钩子函数拦截并获取该“播放音乐”目标Service启动请求。
第一启动模块502,将该原始启动请求中的请求启动的目标Service的名称修改为与进程对应的代理Service的名称,并基于修改后的启动请求,启动代理Service。
具体地,该装置还包括:注册模块,在manifest配置文件中预注册至少一个代理Service的注册信息。
其中,第一启动模块502用于基于该修改后的启动请求和代理Service的注册信息,通过Android系统启动代理Service。
例如,第一启动模块502,将拦截到的该目标Service启动请求中的请求启动的“播放音乐”目标Service的名称“播放音乐”修改为代理Service1的名称,如“ProxyService1”;Android系统基于将该修改后的启动请求和代理Service1的注册信息,启动该代理Service1。
需要说明的是,在应用程序的manifest配置文件中,根据需要可以注册多个代理Service,每个代理Service随意代理任一分身应用程序的任一进程中的所有Service。
第二启动模块503,基于原始启动请求,通过已启动的代理Service启动目标Service。
具体地,第二启动模块503包括:如图7所示,加载单元701,基于原始启动请求中的请求启动的目标Service的标识信息,通过已启动的代理Service加载该目标Service;创建单元702,创建目标Service的对象;执行单元703,基于目标Service的对象,通过已启动的代理Service向目标Service发送执行通知,从而启动目标Service。
例如,加载单元701,基于该“播放音乐”目标Service启动请求中的请求启动的目标Service的名称“播放音乐”,已启动的代理Service1通过类加载器ClassLoader加载该“播放音乐”目标Service;创建单元702,通过反射机制和handleCreateService方法,创建出“播放音乐”目标Service的Java对象和该“播放音乐”目标Service对应的Context,执行单元703,基于该创建出“播放音乐”目标Service的Java对象、该“播放音乐”目标Service对应的Context,已启动的代理Service1向目标Service发送执行通知intent通信信息,从而启动“播放音乐”目标Service。
具体地,当原始启动请求为目标Service启动请求,该装置还包括:第一返回模块,返回响应于该目标Service启动请求的目标Service启动的标识信息;第二监测模块,当监测到向目标Service发送的停止请求时,拦截并获取该停止请求中的目标Service启动的标识信息;第一停止模块,当获取到针对目标Service的所有目标Service启动的标识信息,则停止目标Service。
例如,当原始启动请求为目标Service启动请求:“播放音乐”目标Service启动请求,通过已启动代理Service1启动“播放音乐”目标Service后,基于该“播放音乐”目标Service已经启动的次数设置目标Service启动的标识信息,如,该“播放音乐”目标Service已经第三次启动,则将该“播放音乐”目标Service启动的标识信息设置为“3”,并第一返回模块,返回响应于该“播放音乐”目标Service启动请求的将该“播放音乐”目标Service启动的标识信息“3”至启动者,如“朋友圈”界面的Activity,第二监测模块,当钩子函数监测到“朋友圈”界面的Activity向“播放音乐”目标Service发送停止请求时,拦截并获取该停止请求中的“播放音乐”目标Service启动的标识信息“3”;由于“播放音乐”目标Service已经第三次启动,说明还返回过“播放音乐”目标Service启动的标识信息“1”和“2”至其他Android系统组件或者启动者,若未获取到该“播放音乐”目标Service启动的标识信息“1”和“2”,则不停止该“播放音乐”目标Service;若已获取到该“播放音乐”目标Service启动的标识信息“1”和“2”,则第一停止模块,停止该“播放音乐”目标Service;从而避免该目标Service的误停,导致其他Android系统组件或者启动者无法继续使用该目标Service。
具体地,当原始启动请求为目标Service绑定启动请求时,装置还包括:获取模块,获取已启动的目标Service返回的调用对象,并将该调用对象作为响应于目标Service绑定启动请求的返回信息;第二返回模块,当再获取到针对已启动的目标Service的目标Service绑定启动请求时,直接将已接收到的该调用对象作为响应绑定启动请求的返回信息。
更具体地,获取模块包括:如图6所示,调用对象获取单元601,基于接收到的Intent通信信息,获取已启动的目标Service返回的调用对象;确定单元602,获取Intent通信信息中的intent哈希码,基于Intent通信信息中的intent哈希码所对应的组件标识信息,确定该调用对象所属的已启动的目标Service;返回单元603,基于该调用对象所属的已启动的目标Service和目标Service绑定启动请求,将该调用对象作为响应目标Service绑定启动请求的返回信息。
例如,当通过钩子函数监测到“腾讯QQ”分身应用程序的“音乐播放器”界面的Activity向“腾讯QQ”分身应用程序的一个进程中的“操作音乐播放器”目标Service,发送目标Service绑定启动请求:“操作音乐播放器”目标Service绑定启动请求时,并通过已启动的代理Service2启动“操作音乐播放器”目标Service后,调用对象获取单元601,基于接收到由“操作音乐播放器”目标Service发送的intent通信信息,获取该intent通信信息中的已启动的“操作音乐播放器”目标Service返回的调用对象binder;基于intent通信信息中用于描述该intent通信信息的各种属性,如,action,category等,的Intent Filter中的int filter Hash Code方法生成的intent哈希码,确定单元602,确定该哈希码所对应的目标Service的名称,即Component name;从而确定该调用对象binder所属的已启动的目标Service为:“操作音乐播放器”目标Service;返回单元603,基于该调用对象binder所属的已启动的“操作音乐播放器”目标Service和该目标Service绑定启动请求中的请求启动对象,将该调用对象binder与目标Service绑定启动请求进行匹配,从而将该调用对象binder作为响应该目标Service绑定启动请求的返回信息;以保证所有各个调用对象都能正确地返回给对应的Android系统组件或启动者,并使得Android系统组件或启动者能够顺利地与目标Service进行交互。当再获取到针对已启动的“操作音乐播放器”目标Service的目标Service绑定启动请求时,直接将已接收到的该调用对象binder作为响应绑定启动请求的返回信息。
具体地,当原始启动请求为目标Service绑定启动请求时,该装置还包括:第三返回模块,返回响应该目标Service绑定启动请求的目标Service绑定启动的标识信息;第三监测模块,当监测到向目标Service发送的目标Service绑定停止请求时,拦截并获取该目标Service绑定停止请求中的目标Service绑定启动的标识信息;第二停止模块,当获取到针对目标Service的所有目标Service绑定启动的标识信息,则停止Service。
例如,当原始启动请求为目标Service绑定启动请求:“操作音乐播放器”目标Service绑定启动请求时,通过已启动代理Service2启动“操作音乐播放器”目标Service后,基于该“操作音乐播放器”目标Service已经启动的次数设置目标Service绑定启动的标识信息,如,该“操作音乐播放器”目标Service已经第三次启动,则将该“操作音乐播放器”目标Service绑定启动的标识信息设置为“03”,并第三返回模块,返回响应于该“操作音乐播放器”目标Service绑定启动请求的将该“操作音乐播放器”目标Service启动的标识信息“03”至启动者,如“音乐播放器”界面的Activity;第三监测模块,当钩子函数监测到“音乐播放器”界面的Activity向“操作音乐播放器”目标Service发送停止请求时,拦截并获取该停止请求中的“操作音乐播放器”目标Service启动的标识信息“03”;由于“操作音乐播放器”目标Service已经第三次启动,说明还返回过“操作音乐播放器”目标Service启动的标识信息“01”和“02”至其他Android系统组件或者启动者,若未获取到该“操作音乐播放器”目标Service启动的标识信息“01”和“02”,则不停止该“操作音乐播放器”目标Service;若已获取到该“操作音乐播放器”目标Service启动的标识信息“01”和“02”,则第二停止模块,停止该“操作音乐播放器”目标Service;从而避免目标Service的误停,导致其他Android系统组件或者启动者无法继续使用该目标Service。
本技术领域技术人员可以理解,本发明包括涉及用于执行本申请中所述操作中的一项或多项的设备。这些设备可以为所需的目的而专门设计和制造,或者也可以包括通用计算机中的已知设备。这些设备具有存储在其内的计算机程序,这些计算机程序选择性地激活或重构。这样的计算机程序可以被存储在设备(例如,计算机)可读介质中或者存储在适于存储电子指令并分别耦联到总线的任何类型的介质中,所述计算机可读介质包括但不限于任何类型的盘(包括软盘、硬盘、光盘、CD-ROM、和磁光盘)、ROM(Read-Only Memory,只读存储器)、RAM(Random Access Memory,随即存储器)、EPROM(Erasable ProgrammableRead-Only Memory,可擦写可编程只读存储器)、EEPROM(Electrically ErasableProgrammable Read-Only Memory,电可擦可编程只读存储器)、闪存、磁性卡片或光线卡片。也就是,可读介质包括由设备(例如,计算机)以能够读的形式存储或传输信息的任何介质。
本技术领域技术人员可以理解,可以用计算机程序指令来实现这些结构图和/或框图和/或流图中的每个框以及这些结构图和/或框图和/或流图中的框的组合。本技术领域技术人员可以理解,可以将这些计算机程序指令提供给通用计算机、专业计算机或其他可编程数据处理方法的处理器来实现,从而通过计算机或其他可编程数据处理方法的处理器来执行本发明公开的结构图和/或框图和/或流图的框或多个框中指定的方案。
本技术领域技术人员可以理解,本发明中已经讨论过的各种操作、方法、流程中的步骤、措施、方案可以被交替、更改、组合或删除。进一步地,具有本发明中已经讨论过的各种操作、方法、流程中的其他步骤、措施、方案也可以被交替、更改、重排、分解、组合或删除。进一步地,现有技术中的具有与本发明中公开的各种操作、方法、流程中的步骤、措施、方案也可以被交替、更改、重排、分解、组合或删除。
以上所述仅是本发明的部分实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (10)

1.一种基于一个Service启动多个Service的方法,其特征在于,包括:
当监测到向应用程序的任一进程的多个目标Service中的任一个目标Service发送的原始启动请求时,拦截并获取该原始启动请求;
将该原始启动请求中的请求启动的目标Service的名称修改为与所述进程对应的代理Service的名称,并基于修改后的启动请求,启动所述代理Service;
基于所述原始启动请求,通过已启动的代理Service启动所述目标Service。
2.根据权利要求1所述的方法,其中,还包括:
在manifest配置文件中预注册至少一个所述代理Service的注册信息;
其中,所述基于修改后的启动请求,启动所述代理Service的步骤,包括:
基于该修改后的启动请求和所述代理Service的注册信息,通过Android系统启动所述代理Service。
3.根据权利要求1所述的方法,其中,当所述原始启动请求为目标Service启动请求,所述方法还包括:
返回响应于该目标Service启动请求的所述目标Service启动的标识信息;
当监测到向所述目标Service发送的停止请求时,拦截并获取该停止请求中的所述目标Service启动的标识信息;
当获取到针对所述目标Service的所有所述目标Service启动的标识信息,则停止所述目标Service。
4.根据权利要求1所述的方法,其中,当所述原始启动请求为目标Service绑定启动请求时,所述方法还包括:
获取已启动的所述目标Service返回的调用对象,并将该调用对象作为响应于所述目标Service绑定启动请求的返回信息;
当再获取到针对已启动的所述目标Service的所述目标Service绑定启动请求时,直接将已接收到的该调用对象作为响应所述绑定启动请求的返回信息。
5.根据权利要求4所述的方法,其中,所述获取已启动的所述目标Service返回的调用对象,包括:
基于接收到的Intent通信信息,获取已启动的所述目标Service返回的调用对象;
其中,将该调用对象作为响应所述目标Service绑定启动请求的返回信息的步骤,具体包括:
获取所述Intent通信信息中的intent哈希码,基于所述Intent通信信息中的intent哈希码所对应的组件标识信息,确定该调用对象所属的已启动的所述目标Service;
基于该调用对象所属的已启动的所述目标Service和所述目标Service绑定启动请求,将该调用对象作为响应所述目标Service绑定启动请求的返回信息。
6.根据权利要求1、4或5所述的方法,其中,当所述原始启动请求为目标Service绑定启动请求时,所述方法还包括:
返回响应该目标Service绑定启动请求的所述目标Service绑定启动的标识信息;
当监测到向所述目标Service发送的目标Service绑定停止请求时,拦截并获取该目标Service绑定停止请求中的所述目标Service绑定启动的标识信息;
当获取到针对所述目标Service的所有所述目标Service绑定启动的标识信息,则停止所述Service。
7.根据权利要求1-6任一项所述的方法,其中,基于所述原始启动请求,通过已启动的代理Service启动所述目标Service的步骤,具体包括:
基于所述原始启动请求中的请求启动的所述目标Service的标识信息,通过已启动的代理Service加载该所述目标Service;
创建所述目标Service的对象;
基于所述目标Service的对象,通过已启动的代理Service向所述目标Service发送执行通知,从而启动所述目标Service。
8.根据权利要求1-7任一项所述的方法,其中,所述原始启动请求包括以下任一项:
目标Service启动请求、目标Service绑定启动请求。
9.一种基于一个Service启动多个Service的装置,其特征在于,包括:
第一监测模块,用于当监测到向应用程序的任一进程的多个目标Service中的任一个目标Service发送的原始启动请求时,拦截并获取该原始启动请求;
第一启动模块,用于将该原始启动请求中的请求启动的目标Service的名称修改为与所述进程对应的代理Service的名称,并基于修改后的启动请求,启动所述代理Service;
第二启动模块,用于基于所述原始启动请求,通过已启动的代理Service启动所述目标Service。
10.根据权利要求9所述的装置,其中,还包括:
注册模块,用于在manifest配置文件中预注册至少一个所述代理Service的注册信息;
其中,所述第一启动模块用于基于该修改后的启动请求和所述代理Service的注册信息,通过Android系统启动所述代理Service。
CN201611235690.4A 2016-12-28 2016-12-28 基于一个Service启动多个Service的方法和装置 Pending CN106775888A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201611235690.4A CN106775888A (zh) 2016-12-28 2016-12-28 基于一个Service启动多个Service的方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201611235690.4A CN106775888A (zh) 2016-12-28 2016-12-28 基于一个Service启动多个Service的方法和装置

Publications (1)

Publication Number Publication Date
CN106775888A true CN106775888A (zh) 2017-05-31

Family

ID=58923858

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201611235690.4A Pending CN106775888A (zh) 2016-12-28 2016-12-28 基于一个Service启动多个Service的方法和装置

Country Status (1)

Country Link
CN (1) CN106775888A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111324888A (zh) * 2018-12-13 2020-06-23 北京奇虎科技有限公司 应用程序启动时的验证方法、装置、电子设备及存储介质

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105843668A (zh) * 2016-03-11 2016-08-10 北京奇虎科技有限公司 派生进程驻存方法、派生程序生成方法及相应的装置

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105843668A (zh) * 2016-03-11 2016-08-10 北京奇虎科技有限公司 派生进程驻存方法、派生程序生成方法及相应的装置

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
SANJAYF: ""源码探索系列31—插件化基础之service组件管理"", 《HTTP://SUO.IM/5MKSKB》 *
WEISHU: ""Android插件化原理解析—Service的插件化"", 《HTTP://WEISHU.ME/2016/05/11/UNDERSTAND-PLUGIN-FRAMEWORK-SERVICE/》 *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111324888A (zh) * 2018-12-13 2020-06-23 北京奇虎科技有限公司 应用程序启动时的验证方法、装置、电子设备及存储介质
CN111324888B (zh) * 2018-12-13 2024-05-10 北京奇虎科技有限公司 应用程序启动时的验证方法、装置、电子设备及存储介质

Similar Documents

Publication Publication Date Title
US12061891B1 (en) Cancel and rollback update stack requests
US20150312176A1 (en) Instant Messaging Systems and Methods
US11397594B1 (en) Dynamic loading of an extending application
US9830139B2 (en) Application experience sharing system
CN108134708B (zh) 监控第三方接口的方法和装置
CN109618176B (zh) 一种直播业务的处理方法、设备和存储介质
US20140040924A1 (en) Invocation of additional processing using remote procedure calls
US20060265492A1 (en) On-demand test environment using automated chat clients
CN111046310A (zh) 页面处理方法、装置、服务器及计算机可读存储介质
CN110198351A (zh) 离线消息的存储方法、装置、服务端及可读存储介质
CN109753419A (zh) 一种非侵入式监控android系统的所有应用的异常日志信息的方法及装置
CN101115180B (zh) 一种电子节目菜单系统及其功能模块动态加载运行方法
CN109614271A (zh) 多个集群数据一致性的控制方法、装置、设备及存储介质
JP2024504131A (ja) 非同期分散モジュラ関数呼び出し
CN114338684A (zh) 一种能源管理系统及方法
CN113645259B (zh) 微服务弹性伸缩方法、系统及相关设备
CN106775888A (zh) 基于一个Service启动多个Service的方法和装置
CN108289056B (zh) 分享动态图表的方法、装置以及计算设备
CN112988353B (zh) 一种应用程序的运行控制方法及装置
US10693987B1 (en) Systems and methods for ensuring presentation of in-application messages
CN110324425B (zh) 混合云交易路由处理方法及装置
CN104346228A (zh) 共享应用程序的方法及终端
CN113596600A (zh) 直播嵌入程序的安全管理方法、装置、设备及存储介质
CN111026466A (zh) 文件处理方法、装置、计算机可读存储介质及电子设备
US20110179121A1 (en) Broadcast Message Management

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
RJ01 Rejection of invention patent application after publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20170531