Android密钥处理(框架)

这个框架的一些部分对我来说还不是很清楚。 我很熟悉input事件的stream程(内核 – > Eventhub – > InputReader – > InputDispatcher – > …)。

情况

(要求:处理input键而不更改Android框架。)我想处理来自设备(键盘/游戏手柄/控制器/ …)的关键事件,但有一些要求。 首先,我不想改变Android框架。 这意味着,我不想扩展WindowManagerPolicy及其function,如interceptKeyBeforeDispatching处理的interceptKeyBeforeDispatching 。 这将导致关键事件被派发到应用层,这很好。 缺点是,我有一个棘手的要求在这里。 例如:当我在玩“愤怒的小鸟”时,按下我连接的input设备上的GoToAlphabutton,Alpha应用程序必须启动。 愤怒的小鸟不知道哪个button是GoToAlpha,不会处理/识别它,并且将会有例如没有意图广播来启动我的Alpha应用程序。

有没有办法处理我的(自定义)键盘事件后,分配,知道在前台的应用程序不能处理的关键?

我(失败的)解决scheme

  • 创build一个处理关键事件的服务。 这是不可能的,因为像愤怒的小鸟这样的应用程序不会绑定到我的服务,关键事件不会被抓到我的服务。 如果我错了,请提供更多信息:)。

  • 创build一个外部库,允许我的应用程序的活动从我自己的ActivityBaseinheritance。 所有关键事件和默认行为都可以在这里处理。 缺点是,现有的应用程序不会支持我的自定义关键事件,因为他们不使用库。

  • 扩展框架将在我眼中是最干净的解决scheme,但这将导致不符合我的要求。

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

额外

如果第一个问题可以通过某种方式解决..我想定制我的Intent GoToAlphabutton后面。 这意味着..默认情况下,Alpha应用程序将启动,但在用户定制后,Beta应用程序将从现在开始..任何想法?

谢谢

Solutions Collecting From Web of "Android密钥处理(框架)"

感谢Victor的评论。

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

我的解决scheme/妥协

在Android框架内,有一个负责处理InputEventsPhoneWindowManager 。 由SystemServer启动的WindowManagerService是该pipe理器的所有者,并创build一个实例。

通过创build我自己的自定义WindowManager,并让它从Android的PhoneWindowManagerinheritance,我不会失去任何默认function,这使我可以在这个类中添加我自己的实现。 这个结果是添加一个新的文件到框架中,并且只更改了Android框架中的一行: WindowManagerService不会创buildPhoneWindowManager ,但会创build一个CustomPhoneWindowManager (扩展PhoneWindowManager)。

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

我怀疑公众的API是可能的(Boy和Martijn指出安全问题)。

最喜欢你最好的投注(如果你不想自定义Android)

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

它没有给你想要的那种控制,但是对于一些需求来说就足够了。

b)尝试通过整个堆栈(从内核到应用程序)并find一些使用的漏洞。

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