安卓系统的触屏消息处理方法及系统的制作方法
【技术领域】
[0001]本发明涉及移动终端技术领域,特别是涉及安卓系统的触屏消息处理方法及系统。
【背景技术】
[0002]Android系统中,系统进程中的WindowManagerService组件负责触屏消息的监控和派发,系统初始化后,WindowManagerService组件会创建两个线程InputReaderThread和InputDi spatcherThread,InputReaderThread线程负责监控底层驱动的触屏消息,InputDispatcherThread线程负责派发触屏消息到应用层。为了将触屏消息派发到Activity,创建Activity时,需要创建一对InputChannel管道,即ServerlnputChannel和ClientlnputChannel,系统进程的 InputDispatcherThread线程负责管理Server InputChannel管道,Activity所在应用的主线程负责管理Client InputChannel管道。当有触屏消息触发时,InputDispatcherThread线程找到当前处于Focus(获得焦点,也就是处于Activity桟顶部正在使用的意思)的Activity,从中取出其对应的ServerlnputChannel,向ServerlnputChannel管道中写入触屏消息,之后系统会唤醒Server InputChannel对应Client InputChannel的应用主线程,应用主线程运行后,从ClientlnputChanel中取出触屏消息,派发给具体的Activity进行处理。Activity提供了FLAG_N0T_T0UCHABLE属性设置,该属性只是能让当前Focus Act i vi ty接收不到触屏消息,却无法使得其他Activity进行触屏消息处理。
【发明内容】
[0003]鉴于以上所述现有技术的缺点,本发明的目的在于提供安卓系统的触屏消息处理方法及系统,用于解决现有技术中未获得焦点的Activity的不能处理触屏消息的问题。
[0004]为实现上述目的及其他相关目的,本发明提供一种安卓系统的触屏消息处理方法,包括:至少将当前获取焦点的第一 Activity配置成能设置用于放弃处理触屏消息的第一属性;当检测到所述第一Activity设置所述第一属性时,获取所述第一Activity在Activity桟中至少前一位的第二 Activity,并确保其设置有用于传输触屏消息的消息通道;派发触屏消息至所述第二 Activity以利用其消息通道传输触屏消息至应用进程以供处理。
[0005]于本发明的一实施例中,所述的安卓系统的触屏消息处理方法,包括:当检测到所述第一 Activity取消设置所述第一属性时,阻断所述第二 Activity的消息通道,派发触屏消息至所述第一 Activity以利用其消息通道传输触屏消息至应用进程以供处理。
[0006]于本发明的一实施例中,所述第一属性的检测是通过安卓系统中的系统进程创建的第一线程来控制的,所述触屏消息的派发是通过安卓系统中的系统进程创建的第二线程来控制实现的。
[0007]于本发明的一实施例中,所述第二线程通过控制安卓系统中的InputDispatcher组件来实现所述派发。
[0008]于本发明的一实施例中,所述消息通道包括:成对的第一通道及第二通道;所述第一通道用于接收所述触屏消息;所述第二通道用于与应用进程通信以传输所述触屏消息。
[0009]为实现上述目的及其他相关目的,本发明提供一种安卓系统的触屏消息处理系统,包括:设置模块,用于对当前获取焦点的第一 Activity设置用于放弃处理触屏消息的第一属性;检测模块,用于当检测到所述第一Activity设置所述第一属性时,获取所述第一Activity在Activity桟中至少前一位的第二 Activity,并确保其设置有用于传输触屏消息的消息通道;处理模块,用于派发触屏消息至所述第二 Activity以利用其消息通道传输触屏消息至应用进程以供处理。
[0010]于本发明的一实施例中,所述检测模块,还用于当检测到所述第一Activity取消设置所述第一属性时,阻断所述第二Activity的消息通道,通过所述处理模块派发触屏消息至所述第一 Activity以利用其消息通道传输触屏消息至应用进程以供处理。
[0011]于本发明的一实施例中,所述检测模块是通过安卓系统中的系统进程创建的第一线程来实现的,所述处理模块是通过安卓系统中的系统进程创建的第二线程来实现的。
[0012]于本发明的一实施例中,所述第二线程通过控制安卓系统中的InputDispatcher组件来实现所述处理模块的功能。
[0013]于本发明的一实施例中,所述消息通道包括:成对的第一通道及第二通道;所述第一通道用于接收所述触屏消息;所述第二通道用于与应用进程通信以传输所述触屏消息。
[0014]如上所述,本发明提供的安卓系统的触屏消息处理方法及系统,至少将当前获取焦点的第一Activity配置成能设置用于放弃处理触屏消息的第一属性;当检测到所述第一Activity设置所述第一属性时,获取所述第一 Activity在Activity桟中至少前一位的第二Activity,并确保其设置有用于传输触屏消息的消息通道;派发触屏消息至所述第二Activity以利用其消息通道传输触屏消息至应用进程以供处理,当前处于Focus的Activity不进行触屏消息处理时,其它Activity能够接收和处理触屏消息,实现起来清晰、简单、及高效。
【附图说明】
[0015]图1显示为本发明于一实施例中的安卓系统的触屏消息处理方法的流程示意图。
[0016]图2显示为本发明于一实施例中的处理触屏消息的具体实现的流程示意图。
[0017]图3显示为本发明于一实施例中的实现触屏消息派发的具体实现的流程示意图。
[0018]图4显示为本发明于一实施例中的安卓系统的触屏消息处理系统的结构示意图。
[0019]元件标号说明
[0020]1系统
[0021]11设置模块
[0022]12检测模块
[0023]13处理模块
[0024]S1 ?S3 步骤
【具体实施方式】
[0025]以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的【具体实施方式】加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。
[0026]需要说明的是,以下实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。
[0027]本发明的技术方案应用于安卓(Android)操作系统,而可应用于使用安卓(Andro i d)操作系统的移动终端,例如手机或平板电脑上。
[0028]请参阅图1,本发明提供一种安卓系统的触屏消息处理方法,包括:
[0029]步骤S1:至少将当前获取焦点的第一Activity配置成能设置用于放弃处理触屏消息的第一属性。
[0030]步骤S2:当检测到所述第一Activity设置所述第一属性时,获取所述第一Activity在Activity桟中至少前一位的第二 Activity,并确保其设置有用于传输触屏消息的消息通道;所述确保指的是可以是预先已设有的(例如建立时),若检测到没有设置,则可加以设置。
[0031]步骤S3:派发触屏消息至所述第二 Activity以利用其消息通道传输触屏消息至应用进程以供处理。
[0032]于本发明的一实施例中,所述的安卓系统的触屏消息处理方法,还包括:当检测到所述第一 Activity取消设置所述第一属性时,阻断所述第二 Activity的消息通道,派发触屏消息至所述第一 Activity以利用其消息通道传输触屏消息至应用进程以供处理。
[0033]具体来说明以上内容的实现,在Android系统中,系统会将触屏消息发送给当前处于Focus的Activity进行处理,本发明为了实现非Focus的Activity接收和处理触屏消息,处于Focus的Activity需要通过设置新增加的FLAG_DISMISS_TOUCH_EVENT属性(即第一属性)来放弃对于触屏消息的处理,通过取消FLAG_DI SMI SS_T0UCH_EVENT属性重新获得对于触屏消息的处理。设置FLAG_DISMISS_TOUCH_EVENT属性时,当系统进程的WindowManagerService 组件收到FLAG_DISMISS_TOUCH_EVENT属性设置后,获取当前 FocusActivity之前的Activity组件,并获取其中的Inp
utWindowHandle成员,确保其已经设置好了接收触屏消息的消息通道I n p u t C h a η n e 1,然后通过J Ν I接口通知C + +层的InputDispatcher 组件,InputDispatcher 收到FLAG_DISMISS_TOUCH_EVENT属性设置和需要接收和处理触屏消息的Activity对应的InputWindowHandle后,保存其InputWindowHandle。当驱动层有触屏消息发送过来时,InputDispatcher读取当前设置的非Focus的Activity对应的InputWindowHandle,然后将触屏消息通过其InputChannel发送到应用层面的InputQueue.java中的DispatchMot1nEvent函数进行触屏消息的处理。
[0034]反之,当取消FLAG_DISMISS_TOUCH_EVENT属性设置时,C++层的InputDispatcher组件则会删除之前设置的非Focus的Activity对应的InputWindowHandle,当驱动层有触屏消息发送过来时,直接获取Focus Activity对应的InputWindowHandle,然后将触屏消息通过其InputChannel发送到应用层面的InputQueue.java中的DispatchMot1nEvent函数进行触屏消息的处理;只要Focus的Activity设置了FLAG_DISMISS_TOUCH_EVENT属性,则之前的非Focus的Activity就可以接收和处理触屏消息了,当Focus的Activity取消FLAG_DISMISS_TOUCH_EVENT属性设置后,则Focus的Activity可以重新接收和处理触屏消息。
[0035]于本发明的一实施例中,所述第一属性的检测是通过安卓系统中的系统进程创建的第一线程来控制的,所述触屏消息的派发是通过安卓系统中的系统进程创建的第二线程来控制实现的。
[0036]具体的,Android系统中,系统进程的InputReaderThread线程(即第一线程)负责监控驱动层的触屏消息,当有触屏消息产生时,将消息转交给系统进程的1叩1^018口31:01161'1'11^3(1线程(8卩第二线程)进行派发,具体的派发工作由所述0++层的InputDispatcher组件完成。由于触屏消息需要派发到应用进程进行处理,所以在创建新的Activity 时,需要创建一对 InputChannel(ServerInputChannel(即第一通道)和ClientlnputChannel(第二通道)),作为进程间通信的管道机制的两端,ServerlnputChannel 作为 Activity 的 InputWindowHandle的成员配置到 C++层的InputDispatcher组件中(InputDispatcher组件运行于系统进程的InputDispatcherThread线程中,专门用于触屏消息的派发),ClientInputChannel作为Activity的接收端,承载于Activity所在进程的主线程中,这样就构建了系统进程与应用进程间的通信管道。当有触屏消息需要派发时,InputDispatcher组件首先获取当前处于Focus 的 Activity 的 InputWindowHandle,取出其中的成员 Server InputChannel,即服务端的管道,向Server InputChannel管道中写入触屏消息后,由于Server InputChannel和Cl ient InputChannel是成对的,底层系统监测到Server InputChannel管道中写入内容后,即会唤醒Client InputChannel管道对应的线程,即Activity所在进程的主线程被唤醒,从Client InputChannel中读取触屏消息,派发给对应的Activity进行处理。
[0037]以上是本发明在Android系统设计的触屏消息的技术方案,基于此原理,以下说明本技术方案中几个重要部分是如何实现的:FLAG_DISMISS_TOUCH_EVENT属性设置、FLAG_DISMISS_TOUCH_EVENT属性取消设置、InputDispatcher中触屏消息派发。具体描述如下:
[0038]A.关于 FLAG_DISMISS_TOUCH_EVENT 属性设置:
[0039]FLAG_DISMISS_TOUCH_EVENT属性在 Activity 中设置,作为 Activity 中的一个属性,Activity属性定义在WindowManager.java中,在WindowManager.java中定义新增加的FLAG_DISMISS_TOUCH_EVENT 属性例如以下所示:
[0040]public static final int FLAG_DISMISS_T0UCH_EVENT = 0x80000000;
[0041 ]当Activity在处于Focus的情况下,主动放弃触屏消息的处理,桟中的前一个Activity在没有处于Foucs的情况下,可以接收到所有的触屏消息;此时Activity就可以设置FLAG_DI SMI SS_T0UCH_EVENT属性,需要在Act i vi ty.java中新增FLAG_DI SMISS_T0UCH_EVENT属性设置函数:
[0042]public void dismissTouchEvent(){
[0043]Window win = getffindow();
[0044]win.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_T0UCH_EVENT);
[0045]}
[0046]这里首先获得Activity对应的Window实例,然后调用Window实例中的addFlags函数将FLAG—DISMISS—TOUCH—EVENT设置到系统中。由于Activity的属性功能都是在系统进程中的WindowManagerService组件中实现,最终会将属性变化更新到WindowManagerService中,即会调用 WindowManager Service 的re layoutWindow 函数来完成 WindowManagerService组件中的属性更新,为了实现FLAG —DISMISS —TOUCH—EVENT属性功能,需要在WindowManagerService 的re layoutWindow函数中对FLAG—DISMISS—TOUCH—EVENT属性进行处理,首先在Activity的属性参数中匹配FLAG—DISMISS—TOUCH—EVENT属性,确定设置了FLAG—DI SMI SS—TOUCH—EVENT 属性后,从WindowManager Service 的成员 Array Li st〈WindowState>mWindows数组中取出第二个WindowState实例,mWindows数组中的第一个WindowState实例是当前Focus Activity所对应的,数组中的第二个WindowState实例即对应Focus Activity的前一个Activity,接下来从WindowState实例中取出1叩1^胃;!_11(10¥!^11(116和1111叩1^¥;!_11(10¥!^11(116成员(用于输入窗口控制的组件),然后调用InputDispatcher.cpp组件中新增加的函数setHandleTou chEvent Input Window 将mlnputWindowHandle设置到InputDispatcher组件中。
[0047]InputDispatcher.cpp中的setHandleTouchEventlnputWindow函数(可理解为设置处理触屏消息输入窗口函数)处理流程如图2及以下所示:
[0048]11)将Java参数InputWindowHandle iwh转换成C++数据;
[0049]具体的,该步骤的目的在于:由于setHandleTouchEventlnputWindow函数是在Java层的WindowManagerService.java中调用,中间经过了 Java虚拟机的JNI接口,所以需要调用JNI函数将参数转换成C++层能够识别和处理的数据格式。
[0050]12)循环匹配 1叩此018口3七(31161'中的111¥;!_11(10¥!^11(1168向量;
[0051 ] 具体的,该步骤的目的在于:InputDispatcher中的成员Vector <sp〈Inputff indowHandl e>>mff indowHandl es标识了所有已经打开的 Ac t i vi ty对应的InputWindowHandle,标识这些Activity具有接收触屏消息的能力。
[0052]13)mWindowHandles向量是否包含了传递参数iwh?,若否,贝丨j不作处理跳出,表示上层配置的InputWindowHandle不具有处理触屏消息的能力,此
次配置失败;若是,则进行下一步;
[0053]具体的,该步骤的目的在于:需要检查上层配置的InputWindowHandle已经位于mWindowHandles表中,只有位于mWindowHandles表中的InputWindowHandle才具有接收触屏消息的能力。
[0054]1 4)设置成员bool mHandleTouchEnable为true;
[0055]具体的,该步骤的目的在于:在InputDispatcher.cpp新定义成员boolmHandleTouchEnable,标识 Java层是否配置了 InputWindowHandle下来,如果为 true,则使用配置的InputWindowHandle进行触屏消息处理,否则使用当前Focus的Activity对应InputWindowHandle处理触屏消息。
[0056]15)设置成员 mHandleTouchWinow 为传递参数 iwh;
[0057]具体的,该步骤的目的在于:在InputDispatcher.cpp新定义成员sp〈InputffindowHandle>mHandleTouchffindow?当上面定义的成员mHandleTouchEnable为ture时,则使用mHandleTouchWindow处理触屏消息。
[0058]16)调用resetTargetsLocked函数进行目标更新;
[0059]具体的,该步骤的目的在于:InputDispatcher.cpp中的resetTargetsLocked函数,会设置重新获取目标InputWindowHandle的标志,当有触屏消息需要派发时,会更新目标InputWindowHandleο
[0060]简述上述流程的原理,InputDispatcher.cpp中新增了成员boolmHandleTouchEnable和sp〈InputWindowHandl>mHandleTouchWindow0mHandleTouchEnable用来标识上层是否配置了接收触屏消息的InputWindowHandle,mHandleTouchWindow则标识具体配置的InputWindowHandle,如果没有配置,则将触屏消息派发给当前处于FocusAct ivity对应的InputWindowHandle,如果配置了,则将触屏消息派发给已经配置的mHandleTouchWindow进行处理在配置完成后,需要调用resetTargetsLocked函数,该函数将InputDi spat cher.0口口中的成员1^111'代1^1叩1^13作6口311(1标志置为€3186,同时清空mCurrentInputTargets,mCurrentInputTargets标识当前处理触屏消息的InputWindowHandle 当有触屏消息派发时,首先会检查mCurrentlnputTargetVal id标志是否为false,一旦为false,则需要重新配置 mCurrentlnputTargets,mCurrentInputTargets一般配置为当前Focus Activity对应的InputWindowHandle,在这里需要判断前面新增加的成员mHandleTouchEnable,如果为true,则配置mHandleTouchWindow作为处理触屏消息的InputWindowHandle,只有当mHandleTouchEnable为false时,才配置当前FocusAct ivity 对应的 InputWindowHandle 作为处理触屏消息的 InputWindowHandle。
[0061 ] B.关于 FLAG—DISMISS—TOUCH—EVENT属性取消设置:
[0062]取消FLAG—DISMISS—TOUCH—EVENT属性设置的流程与FLAG—DISMISS—TOUCH—EVENT属性设置的流程基本一致,需要在Act ivity.java中增加取消属性设置函数:
[0063]public void unDismissTouchEvent(){
[0064]Window win = getffindow();
[0065]win.clearFlags(WindowManager.LayoutParams.FLAG—DISMISS—TOUCH—EVENT);
[0066]}
[0067]调用Window 的 clearFlags 函数来取消FLAG—DISMISS—TOUCH—EVENT属性设置,接下来会将属性更新到WindowManagerService的relayoutWindow函数中,最终调用C++层的InputDispatcher.cpp 中新增加的cancelHandleTouchEventlnputWindow函数,该函数中只需要将前面定义的bool mHandleTouchEnable成员设为false,将sp〈InputWindowHandle〉mHandleTouchWindow置为null,最后调用resetTargetsLocked函数重新更新接收触屏消息的目标InputWindowHandle。
[0068]C.关于InputDispatcher中触屏消息派发:
[0069]当第一线程InputReaderThread线程监控到底层驱动有触屏消息触发后,将触屏消息转交给第二线程I n p u t D i s p a t c h e r T h r e a d线程进行触屏消息的派发,InputReaderThread线程继续监控底层驱动。InputDi spatcherThread线程收到InputReaderThread线程发送过来的触屏消息后,调用InputDispatcher组件的d i s p a t c h Μ ο t i ο n L ο c k e d函数进行触屏消息派发,该函数首先会判断成员mCurrentlnputTargetsValid 的值(前面进行 FLAG—DISMISS—TOUCH—EVENT属性设置时,调用resetTargetsLocked函数对该值进行过设置),如果为false,则需要更新当前需要处理触屏消息的目标InputWindowHandle,处理流程如图3及以下所示:
[0070]20)进入dispatchMot1nLocked触屏消息派发函数;
[0071 ] 21)判断111(^111'代1^1叩1^13作6七8\^11(1是否为€3186?若是,则进入步骤22);若否,则进入
[0072]步骤27);
[0073]该判断步骤的目的主要是:mCurrentlnputTargetsValid标识是否需要更新接收处理触屏消息的InputWindowHandle,在进行FLAG—DISMISS—TOUCH—EVENT属性设置或者取消该属性设置后,都会将mCurrent Input Tar gets Val id设置为false,以便这里更新mCurrentlnputTarges 向量表。
[0074]22)清空mCurrentlnputTargets 向量表;
[0075]23)判断mHandleTouchEnable是否为true?若是,贝丨j进入步骤24),若否则进入步骤25);
[0076]该判断步骤的目的主要是:在进行FLAG—DISMISS—TOUCH—EVENT属性设置或者取消该属性设置后,都会设置mHandleTouchEnable标志,为true时,需要将设置的mHandleTouchWindow作为处理触屏消息的InputWindowHandle,为false时,将处于FocusActivity 对应 InputWindowHandle 艮 PlnputDispatcher.cpp 中的成员mFocusWindowHandle 作为处理触屏消息的 InputWindowHandle c^_InputWindowHandle 添加到mCurrentlnputTargets中 0
[0077]24)将 mHandleTouchWindow 添加到mCurrentlnputTargets;进而进入步骤 26)
[0078]25)将 mFocusWindowHandle 添加到mCurrentlnputTargets;进而进入步骤 26)
[0079]26)将 mCurrentlnputTargetsValid 设置为 true,进而跳转步骤 27)
[0080]27)从mCurrentlnputTargets中取出成员InputChannel;
[0081 ] 28)将触屏消息写入InputChannel管道中;
[0082]步骤27)、28)的主要目的是:直接从mCurrent I nput Targe t s中取出成员InputChannel,InputChannel 艮P是创建的一对InputChannel 中的ServerlnputChannel,向该InputChannle中写入触屏消息,那么监控ClientlnputCha
nnle的应用进程的主线程就会被调度,然后从Client InputChannle中读取触屏消息,派发给对应Act ivity进行处理。从而完成触屏消息派发到Act ivity的过程。
[0083]简述所述InputDispatcher中触屏消息派发的实现:在进行FLAG—DISMISS—TOUCH—EVENT属性设置和取消FLAG —DISMISS —TOUCH —EVE NT属性设置时,都调用了resetTargetsLocked 函数将 mCurrent InputTargetsVal id 设为false,所以这里需要更新处理触屏消息的 InputWindowHandle D 当mHandleTouchEnable 为false 时,直接将当前FocusActivity 对应的 InputWindowHandle作为处理触屏消息的 Inputff indowHandl e。当mHandleTouchEnable为true时,则将FLAG—DISMISS—TOUCH—EVENT属性设置时配置的InputWindowHandle作为处理触屏消息的InputWindowHandle,而不是处于Focus Activity对应的 InputWindowHandle。之后将 mCurrent InputTaretsVal id 设置为 ture,这样处理下一个触屏消息时,就不需要再次更新处理触屏消息的I n p u t W i n d o w H a n d 1 emCurrentInputTagets,而是直接从mCurrentInputTagets取出 InputChannel,将触屏消息写入到InputChannle管道中该InputChannel即是Act ivity创建时,为了能够在系统进程和应用进程间传递触屏消息所构建的一对管道中的ServerlnputChannle,另一个管道ClientlnputChannel由Activity所在的应用进程的主线程进行监控。这里向ServerlnputChannle中写入了触屏消息,ClientlnputChannel会收到该触屏消息,系统会调度起对应的ClientlnputChannel对应的应用进程的主线程开始运行,读取ClientlnputChannel中的触屏消息,然后调用对应的Activity的触屏消息处理函数进行触屏消息的处理。只要Focus Act ivity设置了FLAG_DISMISS_TOUCH_EVENT属性,处于该Activity前一个的非Focus Activity就能够接收和处理触屏消息。
[0084]如图4所示,本发明提供一种安卓系统的触屏消息处理系统1,其技术原理同上述方法实施例大致相同,因此相同的技术特征不再重复赘述;所述系统1包括:设置模块11,用于对当前获取焦点的第一 Activity设置用于放弃处理触屏消息的第一属性;检测模块12,用于当检测到所述第一 Activity设置所述第一属性时,获取所述第一 Activity在Activity栈中至少前一位的第二 Activity,并确保其设置有用于传输触屏消息的消息通道;处理模块13,用于派发触屏消息至所述第二Activity以利用其消息通道传输触屏消息至应用进程以供处理。
[0085]于本发明的一实施例中,所述检测模块12,还用于当检测到所述第一Activity取消设置所述第一属性时,阻断所述第二 Activity的消息通道,通过所述处理模块派发触屏消息至所述第一 Activity以利用其消息通道传输触屏消息至应用进程以供处理。
[0086]于本发明的一实施例中,所述检测模块12是通过安卓系统中的系统进程创建的第一线程来实现的,所述处理模块13是通过安卓系统中的系统进程创建的第二线程来实现的。
[0087]于本发明的一实施例中,所述第二线程通过控制安卓系统中的InputDispatcher组件来实现所述处理模块的功能。
[0088]于本发明的一实施例中,所述消息通道包括:成对的第一通道及第二通道;所述第一通道用于接收所述触屏消息;所述第二通道用于与应用进程通信以传输所述触屏消息。
[0089]综上所述,本发明提供的安卓系统的触屏消息处理方法及系统,至少将当前获取焦点的第一Activity配置成能设置用于放弃处理触屏消息的第一属性;当检测到所述第一Activity设置所述第一属性时,获取所述第一 Activity在Activity桟中至少前一位的第二Activity,并确保其设置有用于传输触屏消息的消息通道;派发触屏消息至所述第二Activity以利用其消息通道传输触屏消息至应用进程以供处理,当前处于Focus的Activity不进行触屏消息处理时,其它Activity能够接收和处理触屏消息,实现起来清晰、简单、及高效。
[0090]所以,本发明有效克服了现有技术中的种种缺点而具高度产业利用价值。
[0091]上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。
【主权项】
1.一种安卓系统的触屏消息处理方法,其特征在于,包括: 至少将当前获取焦点的第一 Activity配置成能设置用于放弃处理触屏消息的第一属性; 当检测到所述第一 Activity设置所述第一属性时,获取所述第一 Activity在Activity栈中至少前一位的第二 Activity,并确保其设置有用于传输触屏消息的消息通道; 派发触屏消息至所述第二 Activity以利用其消息通道传输触屏消息至应用进程以供处理。2.根据权利要求1所述的安卓系统的触屏消息处理方法,其特征在于,包括: 当检测到所述第一 Activity取消设置所述第一属性时,阻断所述第二 Activity的消息通道,派发触屏消息至所述第一 Activity以利用其消息通道传输触屏消息至应用进程以供处理。3.根据权利要求1或2所述的安卓系统的触屏消息处理方法,其特征在于,所述第一属性的检测是通过安卓系统中的系统进程创建的第一线程来控制的,所述触屏消息的派发是通过安卓系统中的系统进程创建的第二线程来控制实现的。4.根据权利要求3所述的安卓系统的触屏消息处理方法,其特征在于,所述第二线程通过控制安卓系统中的InputDispatcher组件来实现所述派发。5.根据权利要求3所述的安卓系统的触屏消息处理方法,其特征在于,所述消息通道包括:成对的第一通道及第二通道;所述第一通道用于接收所述触屏消息;所述第二通道用于与应用进程通信以传输所述触屏消息。6.—种安卓系统的触屏消息处理系统,其特征在于,包括: 设置模块,用于对当前获取焦点的第一 Activity设置用于放弃处理触屏消息的第一属性; 检测模块,用于当检测到所述第一Activity设置所述第一属性时,获取所述第一Activity在Activity桟中至少前一位的第二 Activity,并确保其设置有用于传输触屏消息的消息通道; 处理模块,用于派发触屏消息至所述第二 Activity以利用其消息通道传输触屏消息至应用进程以供处理。7.根据权利要求6所述的安卓系统的触屏消息处理系统,其特征在于,所述检测模块,还用于当检测到所述第一 Activity取消设置所述第一属性时,阻断所述第二 Activity的消息通道,通过所述处理模块派发触屏消息至所述第一 Activity以利用其消息通道传输触屏消息至应用进程以供处理。8.根据权利要求6或7所述的安卓系统的触屏消息处理系统,其特征在于,所述检测模块是通过安卓系统中的系统进程创建的第一线程来实现的,所述处理模块是通过安卓系统中的系统进程创建的第二线程来实现的。9.根据权利要求8所述的安卓系统的触屏消息处理系统,其特征在于,所述第二线程通过控制安卓系统中的InputDispatcher组件来实现所述处理模块的功能。10.根据权利要求8所述的安卓系统的触屏消息处理系统,其特征在于,所述消息通道包括:成对的第一通道及第二通道;所述第一通道用于接收所述触屏消息;所述第二通道用于与应用进程通信以传输所述触屏消息。
【专利摘要】本发明提供的安卓系统的触屏消息处理方法及系统,至少将当前获取焦点的第一Activity配置成能设置用于放弃处理触屏消息的第一属性;当检测到所述第一Activity设置所述第一属性时,获取所述第一Activity在Activity栈中至少前一位的第二Activity,并确保其设置有用于传输触屏消息的消息通道;派发触屏消息至所述第二Activity以利用其消息通道传输触屏消息至应用进程以供处理,当前处于Focus的Activity不进行触屏消息处理时,其它Activity能够接收和处理触屏消息,实现起来清晰、简单、及高效。
【IPC分类】G06F9/54
【公开号】CN105487934
【申请号】CN201510855511
【发明人】田泽丰
【申请人】上海斐讯数据通信技术有限公司
【公开日】2016年4月13日
【申请日】2015年11月30日