Android-Schlüsselverarbeitung (Framework)

8

Es gibt einige Teile des Frameworks, die mir noch nicht ganz klar sind. Ich kenne den Ablauf eines Eingabeereignisses sehr gut (Kernel - & gt; Eventhub - & gt; InputReader - & gt; InputDispatcher - & gt; ...).

Situation

(Anforderungen: Behandeln Sie Eingabeschlüssel, ohne das Android Framework zu ändern.) Ich möchte wichtige Ereignisse von einem Gerät (Tastatur / Gamepad / Controller / ...) behandeln, aber es gibt einige Anforderungen. Zum einen möchte ich das Android-Framework nicht ändern. Das heißt, ich möchte das WindowManagerPolicy und seine Funktionen wie interceptKeyBeforeDispatching nicht erweitern, wenn der Home-Key bearbeitet wird. Dies würde dazu führen, dass das Schlüsselereignis in die Anwendungsebene gesendet wird, was in Ordnung ist. Der Nachteil ist, ich habe hier noch eine knifflige Anforderung. Beispiel: Wenn ich Angry Birds spiele und meine GoToAlpha-Taste an meinem angeschlossenen Eingabegerät drücke, muss die Alpha-Anwendung starten. Angry Birds hat keine Ahnung, welcher Button GoToAlpha ist, wird es nicht behandeln / erkennen und es wird zum Beispiel keine Absicht gesendet, meine Alpha-Anwendung zu starten.

Frage

Gibt es eine Möglichkeit, mein (benutzerdefiniertes) Schlüsselereignis nach dem Versand zu verarbeiten, wenn ich weiß, dass die Anwendung im Vordergrund den Schlüssel nicht verarbeiten kann?

Meine (gescheiterten) Lösungen

  • Erstellen Sie einen Dienst, der die Schlüsselereignisse verarbeitet. Dies ist nicht möglich, da eine Anwendung wie "Angry Birds" nicht an meinen Dienst gebunden ist und das Schlüsselereignis nicht in meinem Dienst erfasst wird. Wenn ich falsch liege, bitte geben Sie weitere Informationen:).

  • Erstellen Sie eine externe Bibliothek, in der die Aktivitäten meiner Anwendung von meiner eigenen ActivityBase übernommen werden. Alle wichtigen Ereignisse und ihr Standardverhalten können hier behandelt werden. Nachteilige, vorhandene Anwendungen unterstützen meine benutzerdefinierten Schlüsselereignisse nicht, da sie die Bibliothek nicht verwenden.

  • Erweitern Sie den Rahmen wäre in meinen Augen die sauberste Lösung, aber das wird nicht meine Anforderung erfüllen.

Jede Hilfe oder nützliche Information wäre willkommen

  

Extra

     

Wenn die erste Frage auf die eine oder andere Weise gelöst werden könnte ... will ich   um mein Intent hinter dem GoToAlpha-Button anzupassen. Dies bedeutet .. Von   Standard wird die Alpha-Anwendung gestartet, aber nachdem der Benutzer hat   angepasst, wird ab sofort die Beta-Anwendung gestartet. Any   Gedanken?

Danke

    
DroidBender 14.08.2012, 07:28
quelle

2 Antworten

3

Danke für den Kommentar Victor.

Die Verwendung von InputMethodService bietet mir nicht genug Freiheit und Funktionalität, um meine Probleme zu lösen.

Meine Lösung / Kompromiss

Im Android Framework gibt es ein PhoneWindowManager , das für die Behandlung von InputEvents verantwortlich ist. Das WindowManagerService , das von SystemServer gestartet wird, ist der Besitzer dieses Managers und erstellt eine Instanz.

Indem ich meinen eigenen benutzerdefinierten WindowManager erstelle und ihn von PhoneWindowManager von Android erben lasse, verliere ich keine Standardfunktionalität und dies erlaubt mir, meine eigene Implementierung innerhalb dieser Klasse hinzuzufügen. Das Ergebnis ist das Hinzufügen einer neuen Datei zum Framework und das Ändern nur einer Zeile im Android Framework: WindowManagerService erstellt kein PhoneWindowManager , sondern erstellt ein CustomPhoneWindowManager (erweitert PhoneWindowManager).

Wenn jemand eine bessere Lösung sieht oder bestimmte Gedanken über meine Kompromisse hat, zögern Sie nicht, dies zu kommentieren. :)

    
DroidBender 22.08.2012, 07:35
quelle
0

Ich bezweifle, dass dies mit öffentlichen APIs möglich ist (Boy und Martijn wiesen auf Sicherheitsbedenken hin).

Am liebsten wären Ihre besten Wetten (wenn Sie Android nicht anpassen möchten)

a) Versuchen Sie InputMethodService (http://developer.android.com/reference/android/inputmethodservice/InputMethodService.html)

zu verwenden

Es gibt nicht die Art von Kontrolle, die Sie wünschen, aber es könnte genug für einige Bedürfnisse sein.

b) Versuchen Sie, den gesamten Stack (vom Kernel zur Anwendung) durchzugehen und einige Schwachstellen zu finden, die Sie verwenden können.

Dies wird definitiv viel Zeit in Anspruch nehmen und garantiert keine Früchte zu bringen.

    
Victor Ronin 21.08.2012 23:04
quelle