[0039] 以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。
[0040] 请参阅图3至图7。需要说明的是,以下实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。
[0041] 为了完成一个APP只需一个Binder线程就能够处理窗口管理服务过来的请求和服务的功能,本发明的窗口管理服务与APP间的通信通道建立方法和系统在APP打开时就创建IWindow接口实例,同时创建了对应的Binder服务线程,用来监控窗口管理服务的请求和服务,这样在之后每打开一个Activity时,不再需要创建新的IWindow接口实例和对应的Binder服务线程,但是需要生成一个WindowID,每个Activity都对应不同的WindowID,并且通过sWindowSession远程调用接口,调用窗口管理服务的会话服务,将IWindow接口实例和WindowID传递到窗口管理服务中,窗口管理服务收到请求后,创建窗口状态实例来与Activity进行对应,保存IWindow接口实例和WindowID,并且建立WindowID和WindowState实例对应的哈希表sWindowMap。后续的APP中的各组件通过sWindowSession远程接口调用窗口管理服务中的会话服务时,都附带WindowID参数,会话服务线程通过该WindowID参数从哈希表sWindowMap中找到对应的窗口实例,来完成相应的功能和服务。由于窗口状态实例中保存了IWindow远程接口和WindowID,直接使用该远程接口请求APP提供的IWindow服务,所有的请求都要附带WindowID,应用IWindow对应的Binder服务线程收到请求后,通过WindowID找到对应的Activity,完成相应的功能和服务。
[0042] 实施例1
[0043] 本实施例公开了一种应用于安卓系统的窗口管理服务与APP间的通信通道建立方法,如图3所示,包括:
[0044] 步骤S31,打开一个APP,获取sWindowSession接口,创建一个IWindow接口实例,同时创建一个对应的Binder服务线程,并静态保存IWindow接口实例:
[0045] 在APP创建时,系统会通过远程调用接口调用窗口管理服务的会话开启函数。在会话开启函数中,窗口管理服务会创建会话服务的接口实例sWindowSession,并启动会话服务对应的Binder服务线程,之后将sWindowSession接口返回到APP中,APP以静态的方式保存sWindowSession接口。
[0046] 如此,APP的各组件都可以通过sWindowSession接口访问窗口管理服务的会话服务,其中,会话服务主要提供对Activity在窗口管理服务中的映射窗口状态实例的管理和操作,包括窗口布局、输入法管理、墙纸等等,本发明只是针对APP和窗口管理服务之间的通信通路,关于会话服务的具体的功能就不再详述。
[0047] 获取sWindowSession接口,建立从APP到窗口管理服务的会话服务之间的通信通路时,APP同时需要创建IWindow接口实例,创建IWindow对应的Binder服务线程,静态保存IWindow接口实例。此时还没有Activity创建,仅仅只需要保存IWindow接口实例,当Activity创建时,再使用IWindow接口实例。
[0048] 步骤S32,针对一个APP,打开APP的一个Activity,生成一个对应的WindowID,并将Activity和WindowID添加到哈希表sActivityMap中,且哈希表sActivityMap保存至APP中:
[0049] 由于安卓系统的现有方案是通过多IWindow接口实例来完成窗口管理服务到APP的Activity之间的映射,当只有一个IWindow接口实例时,需要建立标识WindowID来与Activity和窗口状态实例进行一一对应的操作。WindowID是通过随机数的方式生成的,具体流程如图4所示,包括:
[0050] 步骤S41,打开一个Activity;
[0051] 步骤S42,生成一个INT型的随机数;;
[0052] 步骤S43,检索已经打开的Activity对应的WindowID,判断生成的随机数是否与已存在的WindowID相同:如果相同,则重新返回步骤S41,;如果不同,则跳转至步骤S44;
[0053] 步骤S44,将该随机数作为Activity对应的WindowID,并将Activity和WindowID添加到哈希表sActivityMap中。
[0054] 通过随机数的方式生成WindowID,生成随机数后,通过搜索已经存在的WindowID,确保WindowID不冲突,然后将Activity和WindowID添加到哈希表sActivityMap中,该哈希表在IWindow服务线程中会用到,用来完成窗口状态实例到Activity之间的映射。
[0055] 步骤S33,通过sWindowSession接口,附带IWindow接口实例和Activity对应的WindowID调用窗口管理服务的会话服务,创建窗口状态实例,保存IWindow接口和WindowID到窗口状态实例中,将窗口状态实例和WindowID添加到哈希表sWindowMap中,并将哈希表sWindowMap保存至窗口管理服务:
[0056] 当WindowID生成后,通过sWindowSession接口调用窗口管理服务的会话服务,附带IWindow接口实例和Activity对应的WindowID。会话服务收到该请求后,创建窗口状态实例,保存IWindow接口和WindowID到窗口状态实例中,将窗口状态实例和WindowID添加到哈希表sWindowMap中。其中,哈希表sWindowMap是窗口状态实例与WindowID的对应列表。此时APP完成了Activity的创建,WindowManagerService完成了窗口状态实例创建,APP中保存了Activity与WindowID对应的哈希表sActivityMap,WindowManagerService保存了WindowState与WindowID对应的哈希表sWindowMap,WindowState还保存了IWindow接口实例,可以访问APP提供的IWindow服务。
[0057] 对于APP到窗口管理服务之间的通信通道,在现有系统中,APP各组件通过sWindowSession接口访问窗口管理服务的会话服务时,都需要附带IWindow接口实例,每个Activity都会创建对应IWindow接口实例,窗口管理服务的会话服务通过IWindow接口实例从哈希表sWindowMap中找到对应的WindowState实例,从而来完成相应的功能和服务。
[0058] 在本实施例中,如图5所示,APP的所有组件共用一个IWindow接口实例,和一个Binder服务线程,通过sWindowSession接口访问窗口管理服务的会话服务时,都需要附带WindowID,窗口管理服务的会话服务通过WindowID从哈希表sWindowMap中找到对应的窗口状态实例,从而来完成响应的功能和服务。
[0059] 对于窗口管理服务到APP之间的通信通道,在现有系统中,由于每个Activity都有对应IWindow接口实例和Binder服务线程,窗口管理服务的窗口状态实例组件与Activity是一一对应,直接通过IWindow接口就可以访问到Activity提供的服务,不需要进行任何分类操作。
[0060] 在本实施例中,如图6所示,APP各组件共用一个IWindow接口实例,窗口管理服务的窗口状态实例组件访问IWindow接口实例提供的服务时,需要附带WindowID参数,APP层面的IWindow对应的Binder服务线程通过WindowID参数从哈希表sActivityMap中找到对应的Activity实例,从而完成相应的功能和服务。
[0061] 在本实施例中,由于增加了WindowID机制,所以在关闭Activity时,需要释放WindowID。在APP关闭Activity时,需要从哈希表sActivityMap列表中删除该Activity和WindowID对应的组合,还需通过sWindowSession接口远程调用窗口管理服务的会话服务,附带对应的WindowID作为参数,会话服务收到该请求后,通过WindowID从哈希表sWindowMap中找到对应的窗口状态实例,进行相关的释放操作,最后从哈希表sWindowMap列表中删除该窗口状态实例和WindowID对应的组合,从而完成WindowID的释放工作。而现有系统每个Activity都有自己的IWindow接口和Binder服务线程,关闭一个Activity时,需要释放对应的IWindow接口以及关闭Binder服务线程,甚为繁琐。
[0062] 上面各种方法的步骤划分,只是为了描述清楚,实现时可以合并为一个步骤或者对某些步骤进行拆分,分解为多个步骤,只要包含相同的逻辑关系,都在本专利的保护范围内;对算法中或者流程中添加无关紧要的修改或者引入无关紧要的设计,但不改变其算法和流程的核心设计都在该专利的保护范围内。
[0063] 此外,为了突出本发明的创新部分,本实施例中并没有将与解决本发明所提出的技术问题关系不太密切的单元引入,但这并不表明本实施例中不存在其它的单元。
[0064] 本实施例将窗口管理服务到APP之间的多个IWindow通信通路简化成一条通信通路,提高了系统效率;并引入了WindowID机制,通过WindowID机制来完成窗口管理服务的窗口状态实例与APP的Activity之间的映射;并且APP的Activity在打开和关闭时,操作更为简便和优化。
[0065] 实施例2
[0066] 本实施例还公开了一种应用于安卓系统的窗口管理服务与APP间的通信通道建立系统700,如图7所示,包括IWindow接口实例和Binder服务线程的创建单元710、WindowID生成单元720、窗口状态实例生成单元730、哈希表生成单元740和控制单元750。
[0067] IWindow接口实例和Binder服务线程的创建单元710用于根据APP创建IWindow接口实例和Binder服务线程。在APP创建时,获取sWindowSession接口,建立从APP到窗口管理服务的会话服务之间的通信通路,APP同时需要创建一个IWindow接口实例,创建IWindow对应的Binder服务线程,静态保存IWindow接口实例;即一个APP对应一个IWindow接口实例和一个Binder服务线程。
[0068] WindowID生成单元720用于针对同一个APP的不同Activity,生成对应的WindowID。当只有一个IWindow接口实例时,需要建立标识WindowID来与Activity和窗口状态实例进行一一对应的操作;且WindowID是通过随机数的方式生成的。
[0069] 窗口状态实例生成单元730用于通过sWindowSession接口,附带IWindow接口实例和Activity对应的WindowID调用窗口管理服务的会话服务,创建窗口状态实例。当WindowID生成后,通过sWindowSession接口调用窗口管理服务的会话服务,附带IWindow接口实例和Activity对应的WindowID。会话服务收到该请求后,创建窗口状态实例,保存IWindow接口和WindowID到窗口状态实例中。
[0070] 哈希表生成单元740用于生成哈希表sActivityMap和哈希表sWindowMap。其中哈希表sActivityMap是根据WindowID生成单元720而生成的Activity与WindowID的对应列表,其保存在APP中;哈希表sWindowMap是根据窗口状态实例生成单元730生成的窗口状态实例与WindowID的对应列表,其保存至窗口管理服务中。
[0071] 控制单元750用于控制IWindow接口实例和Binder服务线程的创建单元710、WindowID生成单元720、窗口状态实例生成单元730和哈希表生成单元740,控制APP的创建,APP的Activity的打开和关闭,以及在关闭Activity时,控制哈希表生成单元740释放关闭Activity所对应的WindowID在哈希表sActivityMap和哈希表sWindowMap中的组合。
[0072] 需要说明的是,本实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的单元,而非按照实际实施时的单元,其实际实施时各个单元可为一种随意的组合和改变,且其组件布局型态也可能更为复杂。
[0073] 此外,为了突出本发明的创新部分,本实施例中并没有将与解决本发明所提出的技术问题关系不太密切的单元引入,但这并不表明本实施例中不存在其它的单元。
[0074] 并且,不难发现,本实施例为与第一实施例相对应的系统实施例,本实施例可与第一实施例互相配合实施。第一实施例中提到的相关技术细节在本实施例中依然有效,为了减少重复,这里不再赘述。相应地,本实施例中提到的相关技术细节也可应用在第一实施例中。
[0075] 综上所述,本发明的窗口管理服务与APP间的通信通道建立方法和系统,窗口管理服务和APP之间引入了WindowID机制,将现有技术中的窗口管理服务和APP之间的多个IWindow通信通路简化成了一条通信通路,并且,通过WindowID机制完成了窗口管理服务的窗口状态实例与APP的Activity之间的映射。本发明的APP只需要建立一个IWindow的Binder服务线程,大量减少底层系统的Binder开销,增强系统效率,特别是在很多Activity打开的情况下;并且本发明通过WindowID机制更加方便简洁的完成窗口管理服务的窗口状态实例与APP的Activity之间的映射;而且由于WindowID机制的引入,Activity在打开和关闭时,操作更为简便和优化。所以,本发明有效克服了现有技术中的种种缺点而具高度产业利用价值。
[0076] 上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。