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_OFF
或 Intent.ACTION_SCREEN_OFF
。我认为由于安全问题,无法覆盖电源按钮。
我正在做一个事情,我需要在按下时覆盖 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_OFF
或 Intent.ACTION_SCREEN_OFF
。我认为由于安全问题,无法覆盖电源按钮。