Android:覆盖片段中的电源按钮

Android: Overriding the power button in a Fragment

我正在做一个事情,我需要在按下时覆盖 Fragment 中的电源按钮。我成功地做到了这一点,但是,按下电源按钮时屏幕会关闭。

我进行了快速搜索,发现了一些类似 this, this, and this 的帖子。有人说可行,有人说不可行。我的问题是这甚至可行吗?如果是这样,知道如何解决这个问题吗?

您无法覆盖电源按钮功能,但是您可以使用以下方法防止系统在长按电源按钮时显示对话框。

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if(!hasFocus) {
           Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
            sendBroadcast(closeDialog);
        }
    }

你这样做是不可取的。但是,您可以编写一个广播接收器,然后屏幕被锁定,使用 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();  
}

您可以使用它来防止屏幕锁定

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

在片段中使用时

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

使用 BroadcastReceiver 并监听按下电源按钮(并且屏幕打开)时发送的 android.intent.action.SCREEN_OFFIntent.ACTION_SCREEN_OFF。我认为由于安全问题,无法覆盖电源按钮。