8

框架的某些部分对我来说还不是很清楚。我对输入事件的流程(内核 -> Eventhub -> InputReader -> InputDispatcher -> ...)非常熟悉。

情况

(要求:在不更改 Android 框架的情况下处理输入键。) 我想处理来自设备(键盘/游戏板/控制器/...)的键事件,但有一些要求。一方面,我不想更改 Android 框架。这意味着,我不想像处理 home 键的地方WindowManagerPolicy那样扩展 及其功能。interceptKeyBeforeDispatching这将导致关键事件被分派到应用层,这很好。缺点是,我这里还有一个棘手的要求。示例:当我玩 Angry Birds 并按下连接的输入设备上的 GoToAlpha 按钮时,必须启动 Alpha 应用程序。愤怒的小鸟不知道 GoToAlpha 是哪个按钮,不会处理/识别它,例如不会广播任何意图来启动我的 Alpha 应用程序。

问题

有没有办法在我的(自定义)键事件被调度后处理它,知道前台的应用程序无法处理键?

我的(失败的)解决方案

  • 创建一个将处理关键事件的服务。这是不可能的,因为像 Angry Birds 这样的应用程序不会绑定到我的服务,并且关键事件不会被我的服务捕获。如果我错了,请提供更多信息:)。

  • 创建一个外部库,允许我的应用程序的活动从我自己的 ActivityBase 继承。所有关键事件和默认行为都可以在这里处理。不利的一面是,现有应用程序将不支持我的自定义键事件,因为它们不使用该库。

  • 在我看来,扩展框架是最干净的解决方案,但这将导致无法满足我的要求。

任何帮助或有用的信息将不胜感激

额外的

如果第一个问题可以以某种方式解决.. 我想自定义我Intent的 GoToAlpha 按钮。这意味着.. 默认情况下,Alpha 应用程序将启动,但在用户自定义后,Beta 应用程序将从现在开始.. 有什么想法吗?

谢谢

4

2 回答 2

3

感谢维克多的评论。

使用InputMethodService不会为我提供足够的自由和功能来处理我的问题。

我的解决方案/妥协

在 Android 框架内,有一个PhoneWindowManagerwhich 负责处理InputEvents. 由WindowManagerService, 启动的SystemServer是此管理器的所有者并创建一个实例。

通过创建我自己的自定义 WindowManager 并让它从 Android 继承PhoneWindowManager,我不会丢失任何默认功能,这允许我在此类中添加自己的实现。这个结果是向框架添加了一个新文件,并且只更改了 Android 框架内的一行:WindowManagerService不会创建一个PhoneWindowManager,但会创建一个CustomPhoneWindowManager(扩展 PhoneWindowManager)。

如果有人看到更好的解决方案或对我的妥协有任何具体想法,请不要犹豫发表评论。:)

于 2012-08-22T07:35:58.747 回答
0

我怀疑公共 API 是否有可能(Boy 和 Martijn 指出了安全问题)。

最像您最好的选择(如果您不想自定义 Android)将是

a) 尝试使用 InputMethodService (http://developer.android.com/reference/android/inputmethodservice/InputMethodService.html)

它没有提供您希望的那种控制,但它可能足以满足某些需求。

b) 尝试遍历整个堆栈(从内核到应用程序)并找到一些可以使用的漏洞。

这肯定会花费很多时间,并且不能保证带来任何水果。

于 2012-08-21T23:04:48.900 回答