Android事件拦截(3)——系统拦截和应用拦截
创始人
2024-05-29 07:51:47
0

本文主要分析触摸事件和按键事件在不同阶段被拦截的流程,总结在不同阶段不同方法中返回值的含义。

按键的拦截

(1)interceptKeyBeforeQueueing

interceptKeyBeforeQueueing方法的意义就是在事件入队列前拦截按键事件,也就是如果这个阶段被拦截,事件将不会再被分发。

在分发keyevent事件前,会先将event上报给PhoneWindownManager处理,如果PhoneWindowManager消费掉,则不会继续分发给应用,流程如下:
在这里插入图片描述
调用栈如下:

InputDispatcher::injectInputEvent // 触发调用1
InputDispatcher::notifyKey // 触发调用2com_android_server_input_InputManagerService::NativeInputManager::interceptKeyBeforeQueueingInputManagerService::interceptKeyBeforeQueueingIMS::InputManagerCallback::interceptKeyBeforeQueueingWMS::PhoneWindowManager::interceptKeyBeforeQueueing
  • InputDispatcher.notifyKey会通过JNI的方式向PhoneWindowManager通报事件,先交由PhoneWindowManager来处理一些系统的按键,如果PhoneWindowManager已经处理消费且认为按键事件不应再分发给应用程序,则会返回0,否则返回1(ACTION_PASS_TO_USER);

我们在日常开发中,有时候希望事件在系统中消费掉,不传递给应用进行处理,那么可以在这个阶段添加我们的逻辑,只需要将PhoneWindowManager.interceptKeyBeforeQueueing返回0即可。

(2)interceptKeyBeforeDispatching

interceptKeyBeforeDispatching是在事件分发前进行拦截,同样也是交给PhoneWindomManager来进行处理,流程如下:
在这里插入图片描述
调用栈如下:

InputDispatcher::dispatchOnceInputDispatcher::dispatchOnceInnerLocked//InputDispatcher::mPolicy // mPolicy:: com_android_server_input_InputManagerService.cppInputDispatcher::dispatchKeyLockedInputDispatcher::doInterceptKeyBeforeDispatchingLockedInterruptiblecom_android_server_input_InputManagerService::NativeInputManager::interceptKeyBeforeDispatching// jni InputManagerService::nativeInit中初始化InputManagerService::interceptKeyBeforeDispatchingIMS::InputManagerCallback::interceptKeyBeforeDispatchingWMS::PhoneWindowManager::interceptKeyBeforeDispatching
  • InputDisptcher调用dispatchKeyLocked来处理InputReader发送过来的事件,此时的KeyEntry.interceptKeyResult为INTERCEPT_KEY_RESULT_UNKNOWN,如果此事件在上一阶段被设置为POLICY_FLAG_PASS_TO_USER,那么就会生成一个command,去交给PhoneWindowManager去处理;
  • PhoneWindowManager调用interceptKeyBeforeDispatching来处理一些特殊的key事件,如power、home等,然后返回事件被处理的时机(延时),如果事件应被拦截,则返回-1,立即分发则返回0,延迟分发则返回延时的时间;
  • InputDispatcher在处理command的时候根据PhoneWindowManager处理的返回值,将KeyEntry.interceptKeyResult置为不同的flag;
  • 由于InputDispatcher loop里每次只处理一个事件,而每次循环都会优先处理堆积的command,而且mPendingEvent只有当事件被处理完才会置null,因此在下一次loop的时候,处理完command就立即继续处理这个key事件,根据interceptKeyResult来选择是否拦截;

前面两个阶段都是框架层Framework将事件拦截,下面的dispatchKeyEvent主要讲的是应用所能修改的,按照调用的逻辑层次来分析。
在这里插入图片描述

  • 调用View.dispatchKeyEvent(mView就是DecorView),当Window没有被destory,走Activity.dispatchKeyEvent -> PhoneWindow.superDispatchKeyEvent -> DecorView.superDispatchKeyEvent -> ViewGroup.dispatchKeyEvent -> View.dispatchKeyEvent。此调用链中,Activity.dispatchKeyEvent、View.dispatchKeyEvent都是应用开发常常override的方法;
  • 在Activity.dispatchKeyEvent方法(默认实现)中,当PhoneWindow.superDispatchKeyEvent返回了false值,则走KeyEvent.dispatch方法,然后回调Activity的onKeyDown/onKeyUp等方法;
  • 如果Activity.dispatchKeyEvent方法返回了false,则调用到PhoneWindow的onKeyDown/onKeyUp方法;

(3)KeyEvent的拦截总结

在这里插入图片描述

触摸事件的拦截

(1)dispatchTouchEvent

在ViewRootImpl阶段,拦截的过程如下:
在这里插入图片描述

  • InputDispatch将事件分发给对应的ViewRootImpl中,继而将事件分发给DecorView,然后调用到Activity.dispatchTouchEvent -> ViewGroup.dispatchTouchEvent -> View.dispatchTouchEvent。当有一个流程返回true,则将事件拦截;
  • 当Activity.dispatchTouchEvent返回false没有拦截事件,则会调用Activity.onTouchEvent来处理;

(2)MotionEvent的拦截总结

在这里插入图片描述
想了解通俗易懂的应用事件分发机制,可参考如下文章:Android事件拦截(二)——通俗易懂事件分发机制。

相关内容

热门资讯

findx耍原生安卓系统,深度... 亲爱的读者们,你是否厌倦了那些花里胡哨的定制系统,渴望回到那个纯净的安卓世界?今天,我要带你一起探索...
一加系统属于安卓系统吗,引领智... 你有没有想过,手机里的那个神奇的“一加系统”到底是不是安卓系统的一员呢?这可是个让人好奇不已的问题哦...
小米2刷安卓系统吗,探索安卓系... 亲爱的读者,你是否曾经对小米2这款手机刷安卓系统的事情感到好奇呢?今天,就让我带你一探究竟,揭开小米...
安卓7.0系统线刷包,深度解析... 你有没有发现,你的安卓手机最近有点儿“蔫儿”了?别急,别急,今天就来给你揭秘如何让你的安卓手机重焕生...
白菜系统和安卓拍照,开启智能生... 你知道吗?最近我在用手机拍照的时候,发现了一个超级酷的功能,简直让我爱不释手!那就是——白菜系统和安...
安卓系统查杀病毒,全方位守护您... 手机里的安卓系统是不是有时候会突然弹出一个查杀病毒的提示?别慌,这可不是什么大问题,今天就来给你详细...
iso系统与安卓各系统哪个好,... 你有没有想过,手机操作系统就像是我们生活中的不同交通工具,各有各的特色和优势。今天,咱们就来聊聊这个...
中柏怎么换安卓系统,解锁更多可... 你有没有发现,中柏的安卓系统有时候用起来还挺不顺手的?别急,今天就来手把手教你如何给中柏手机升级安卓...
安卓热点绕过系统验证,揭秘操作... 你是不是也遇到过这种情况?手机里的安卓热点突然不灵光了,系统验证总是跳出来,让人头疼不已。别急,今天...
安卓系统怎么关闭小艺,安卓系统... 亲爱的安卓用户们,你是否也和我一样,对手机里的小艺助手有些爱恨交加呢?有时候,它贴心得让人感动,有时...
安卓系统计划软件推荐,精选计划... 你有没有发现,手机里的安卓系统越来越智能了?这不,最近我可是挖到了一些超棒的安卓计划软件,它们不仅能...
收钱吧安卓系统插件,便捷支付新... 你有没有发现,现在的生活越来越离不开手机了?手机里装满了各种应用,而今天我要跟你聊聊一个特别实用的工...
鸿蒙系统是否还属于安卓,独立于... 你有没有想过,那个在我们手机上默默无闻的鸿蒙系统,它到底是不是安卓的“亲戚”呢?这个问题,估计不少手...
安卓系统手机用什么钱包,轻松管... 你有没有想过,你的安卓系统手机里装了那么多应用,但最离不开的,可能就是那个小小的钱包了。没错,就是那...
安卓系统能玩部落冲突吗,部落冲... 你有没有想过,安卓系统上的手机,是不是也能玩那款风靡全球的《部落冲突》呢?这款游戏自从推出以来,就吸...
智能机器人安卓系统,引领未来智... 你知道吗?在科技飞速发展的今天,智能机器人已经不再是科幻电影里的专属了。它们正悄悄地走进我们的生活,...
华为win10系统改装安卓系统... 你有没有想过,你的华为笔记本电脑里的Windows 10系统,能不能来个华丽变身,变成安卓系统呢?这...
旧电脑上安什么安卓系统,适配不... 你那台旧电脑是不是已经闲置好久了?别让它默默无闻地躺在角落里,给它来个华丽变身吧!今天,就让我来告诉...
安卓app语言跟随系统,随系统... 你知道吗?在手机世界里,有一个神奇的小功能,它就像你的贴身翻译官,无论你走到哪里,都能帮你轻松应对各...
惠城安卓系统降级在哪,揭秘降级... 你有没有遇到过手机系统升级后,发现新系统让你头疼不已,想回到那个熟悉的安卓系统呢?别急,今天就来告诉...