捕获Android电源按钮事件

时间:2016-08-06 06:23:42

标签: android android-event

我的应用程序有一个长期运行的后台服务。我使用广播接收器注册了我的服务,广播接收器处理SCREEN_ONSCREEN_OFF个动作。但是,使用这种方法的问题在于,虽然它确实有效,但只要电话被来电,电话线插件事件或alarmmanager等唤醒,SCREEN_ON动作也会触发,我不会我想要那个。

当只有我的后台服务运行时,是否可以“物理”捕获电源按钮单击事件?我不是要试图改写电源按钮。

1 个答案:

答案 0 :(得分:-1)

现有的答案并没有完全回答这个问题,并且遗漏了足够的细节,如果没有更多的调查它们将无法运作。我会分享我学到的解决方法。

首先,您需要将以下权限添加到清单文件中:

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

要处理短按和长按,请在活动类中添加以下覆盖:

@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);
}

注意:值得注意的是onKeyDown()会在onKeyLongPress之前多次触发,因此您可能希望触发onKeyUp()或其他逻辑来阻止对onKeyDown()进行操作{ {1}}当用户真正按住它时调用。

我认为下一部分仅适用于Cyanogenmod。如果未定义PREVENT_POWER_KEY常量,那么您不应该需要它。

要开始拦截电源键,您需要在活动中设置以下标志:

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

停止拦截电源键(允许标准功能):

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

如果您愿意,可以在程序中反复切换两种模式。

参考: https://stackoverflow.com/a/10365166/2724418