覆盖Android中的电源按钮

Posted

技术标签:

【中文标题】覆盖Android中的电源按钮【英文标题】:Overriding the power button in Android 【发布时间】:2012-04-10 19:16:24 【问题描述】:

我正在开发一个应用程序,我需要在按下电源按钮时执行操作,但不幸的是我无法处理按下电源按钮的操作。我尝试使用 onKeyDown() 和 dispatchKeyEvent() 方法,但似乎没有任何效果。谁能建议我解决这个问题的任何其他方法或解决方案。

public boolean onKeyDown(int keyCode, KeyEvent event) 
if (event.getKeyCode() == KeyEvent.KEYCODE_POWER) 
    // The action I want to perform when power button is pressed.
    return true;

return super.onKeyDown(keyCode, event);

@Override
public boolean dispatchKeyEvent(KeyEvent event) 
if (event.getKeyCode() == KeyEvent.KEYCODE_POWER) 
    Intent i = new Intent(this, NewActivity.class);
    startActivity(i);
    return true;

return super.dispatchKeyEvent(event);

【问题讨论】:

重复问题***.com/questions/3703071/… 如果您只担心自己的设备并且如果它已经root,您可以修改键盘布局文件 【参考方案1】:

我找到了答案,这可以通过使用带有 PowerManager 的 AlarmManager 来完成

@Override
public void onReceive(Context context, Intent intent) 
if ((intent.getAction().equals(Intent.ACTION_SCREEN_OFF))) 

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "TEST");
wakeLock.acquire();

AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent inten = new Intent(context,NewActivity.class);
PendingIntent pi = PendingIntent.getActivity(context, 0, inten, 0);
alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,  100, pi);

   

// Finish your WakeLock HERE. call this method after U put the activity in front or when u exit from the new activity.
public void finishWakeLocker()
if (wakeLock != null) 
wakeLock.release();  

这里首先屏幕关闭,然后我使用 AlarmManager 将其唤醒。我无法通过覆盖电源按钮控件来阻止屏幕进入关闭状态。我只是在设备进入睡眠状态后立即唤醒设备。

【讨论】:

太棒了。 wakeLock 到底是做什么的?【参考方案2】:

幸运的是,这是不可能的,除非通过自定义固件。

【讨论】:

【参考方案3】:

我不知道您打算做什么,但您可以使用BroadcastReceiver 并收听按下电源按钮(屏幕打开)时发送的android.intent.action.SCREEN_OFFIntent.ACTION_SCREEN_OFF

不幸的是,当屏幕超时时也会发送此意图。但我认为您可以像这样防止手机被锁定(在应用程序中)

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

【讨论】:

我尝试使用带有 ACTION_SCREEN_OFF 的 BroadCastReceiver,即使按下电源按钮时它没有响应,但另一方面它正在为屏幕超时工作。 使用 ACTION_SCREEN_OFF 我可以在锁定屏幕之前执行这些操作,但无法阻止屏幕被锁定。 是的,intent 在事件发生后发送。我认为您不能覆盖电源按钮的现有功能。

以上是关于覆盖Android中的电源按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖android中的操作栏后退按钮?

如何在Android中锁定屏幕时长按电源按钮启用GPS?

在android中,为啥我的服务在按下电源按钮后没有进入睡眠状态

如何以编程方式在android中检测设备电源按钮按下两次

如果在我的 android 应用程序中没有按下电源按钮 (x) 次,如何启动活动?

覆盖应用浏览器中的完成按钮功能