2016-08-06 16 views
0

Meine App hat einen lange laufenden Hintergrund-Service. Ich habe meinen Dienst mit einem Broadcastempfänger registriert, der die Aktionen SCREEN_ON und SCREEN_OFF handhabt. Allerdings ist das Problem bei der Verwendung dieses Ansatzes, dass, während es funktioniert, immer wenn das Telefon durch eingehende Anrufe geweckt wurde, Stromkabel Plugin-Ereignisse oder alarmmanager etc, SCREEN_ON Aktion löst auch, und ich will das nicht.Capture Android Power Button Ereignis

Ist es möglich, die Click-Ereignisse des Ein-/Ausschalters "physisch" zu erfassen, wenn nur mein Hintergrunddienst ausgeführt wird? Ich versuche nicht, den Netzschalter zu übersteuern.

Antwort

0

Die vorhandenen Antworten beantworten die Frage nicht vollständig und lassen genug Details aus, dass sie ohne weitere Untersuchung nicht funktionieren werden. Ich werde teilen, was ich gelernt habe, das zu lösen.

Zuerst müssen Sie die folgende Berechtigung auf Ihre Manifest-Datei hinzufügen:

<uses-permission android:name="android.permission.PREVENT_POWER_KEY" /> 

kurze und lange drückt die folgenden Überschreibungen Aktivitätsklasse hinzufügen zu handhaben:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_POWER) { 
     // Do something here... 
     event.startTracking(); // Needed to track long presses 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

@Override 
public boolean onKeyLongPress(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_POWER) { 
     // Do something here... 
     return true; 
    } 
    return super.onKeyLongPress(keyCode, event); 
} 

Hinweis: Es ist Erwähnenswert ist, dass onKeyDown() wird mehrere Male vor onKeyLongPress feuern wird so möchten Sie möglicherweise auf onKeyUp() statt oder andere Logik zu verhindern, auf eine Reihe von onKeyDown() Anrufe zu reagieren, wenn der Benutzer rea ist Ich halte es nieder.

Ich denke, dieser nächste Teil ist nur für Cyanogenmod. Wenn die Konstante PREVENT_POWER_KEY nicht definiert ist, sollten Sie sie nicht benötigen.

So starten Sie den Einschaltknopf Sie das folgende Flag aus Ihrer Tätigkeit einstellen müssen Abfangen:

getWindow().addFlags(WindowManager.LayoutParams.PREVENT_POWER_KEY); 

So stoppen Sie die Ein-Taste abfangen (so dass Standardfunktionalität):

getWindow().clearFlags(WindowManager.LayoutParams.PREVENT_POWER_KEY); 

Sie wechseln hin und her zwischen den zwei Modi wiederholt in Ihrem Programm, wenn Sie wünschen.

Referenz: https://stackoverflow.com/a/10365166/2724418

+0

Vielen Dank für Ihre Antwort. Aber Ihre Antwort funktioniert nur, wenn eine Aktivität ausgeführt wird. Meine Anforderung ist, wenn nur der Hintergrunddienst ausgeführt wird. – hal0360