我的应用程序有一个长期运行的后台服务。我使用广播接收器注册了我的服务,广播接收器处理SCREEN_ON
和SCREEN_OFF
个动作。但是,使用这种方法的问题在于,虽然它确实有效,但只要电话被来电,电话线插件事件或alarmmanager
等唤醒,SCREEN_ON
动作也会触发,我不会我想要那个。
当只有我的后台服务运行时,是否可以“物理”捕获电源按钮单击事件?我不是要试图改写电源按钮。
答案 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);
如果您愿意,可以在程序中反复切换两种模式。