Dro*_*der 8 android key-events android-framework
框架的某些部分对我来说还不是很清楚.我熟悉输入事件的流程(内核 - > Eventhub - > InputReader - > InputDispatcher - > ...).
情况
(要求:在不更改Android框架的情况下处理输入键.)
我想处理来自设备(键盘/游戏手柄/控制器/ ...)的关键事件,但有一些要求.首先,我不想改变Android框架.这意味着,我不想扩展WindowManagerPolicy其功能,例如interceptKeyBeforeDispatching处理主键的功能.这将导致将键事件分派到应用程序层中,这很好.缺点是,我在这里有另一个棘手的要求.示例:当我在玩"愤怒的小鸟"时,我按下连接的输入设备上的GoToAlpha按钮,Alpha应用程序必须启动.愤怒的小鸟不知道哪个按钮GoToAlpha是,不会处理/识别它,并且例如没有广播的意图来启动我的Alpha应用程序.
题
有没有办法在调度后处理我的(自定义)键事件,知道前台的应用程序无法处理密钥?
我的(失败的)解决方案
创建一个处理关键事件的服务.这是不可能的,因为像愤怒的小鸟这样的应用程序不会绑定到我的服务,并且关键事件不会被我的服务捕获.如果我错了,请提供更多信息:).
创建一个外部库,我允许我的应用程序的活动从我自己的ActivityBase继承.所有关键事件和默认行为都可以在这里处理.在下方,现有应用程序将不支持我的自定义键事件,因为它们不使用库.
扩展框架在我看来是最干净的解决方案,但这将导致不符合我的要求.
任何帮助或有用的信息将不胜感激
额外
如果第一个问题可以通过这种或那种方式解决..我想
Intent在GoToAlpha按钮后面自定义我.这意味着..默认情况下,Alpha应用程序将启动,但在用户自定义之后,Beta应用程序将从现在开始启动..有什么想法吗?
谢谢
感谢维克多的评论。
使用InputMethodService不会为我提供足够的自由和功能来处理我的问题。
我的解决方案/妥协
在Android框架内,有一个PhoneWindowManager负责处理InputEvents. WindowManagerService由 启动,SystemServer是该管理器的所有者并创建一个实例。
通过创建我自己的自定义 WindowManager 并让它继承 Android 的 WindowManager PhoneWindowManager,我不会丢失任何默认功能,这允许我在此类中添加我自己的实现。结果是向框架添加一个新文件,并仅更改 Android 框架内的一行: 不会WindowManagerService创建PhoneWindowManager,但会创建CustomPhoneWindowManager(extends PhoneWindowManager).
如果有人看到更好的解决方案或对我的妥协有任何具体想法,请随时发表评论。:)