20250925让荣品RD-RK3588-MID开发板的Android13系统在长按3s才弹出关机对话框
2025/9/25 19:58
缘起:一句话,PM要求。
因为是备选方法,也就是使用非常方法达成目的了!
但是有更好方法。成为仅为参考/做笔记!
DeepSeek:配置RK3588+Android13在长按3秒之后才弹出来关机对话框
- 修改电源管理器配置
编辑 frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java:
java
// 在全局常量定义区域添加
private static final int LONG_PRESS_POWER_TIMEOUT = 3000; // 3秒
// 修改interceptKeyBeforeQueueing方法中的相关逻辑
case KeyEvent.KEYCODE_POWER:
if (down) {
// 设置长按超时时间为3秒
mPowerKeyTriggered = true;
mHandler.removeCallbacks(mPowerLongPress);
mHandler.postDelayed(mPowerLongPress, LONG_PRESS_POWER_TIMEOUT);
} else {
mPowerKeyTriggered = false;
mHandler.removeCallbacks(mPowerLongPress);
}
break;
在JAVA程序中延迟3秒
在Java程序中延迟3秒,我们可以使用Thread.sleep()方法。但是要注意,Thread.sleep()可能会抛出InterruptedException,所以我们需要处理这个异常,通常是用try-catch块包围起来。
另外,需要注意的是,Thread.sleep()的参数是毫秒,所以3秒就是3000毫秒。
下面是一个简单的示例,展示如何在当前线程中延迟3秒。
在Java程序中延迟3秒有多种实现方式,以下是几种常见的方法:
- 使用 Thread.sleep()(最常用)
java
try {
// 延迟3秒(3000毫秒)
Thread.sleep(3000);
} catch (InterruptedException e) {
// 处理中断异常
Thread.currentThread().interrupt();
e.printStackTrace();
}
Y:\android13-20250818\frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java
Z:\rk-android13-20250818RD-RK3588-MID\frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java
if (mDoublePressOnPowerBehavior != MULTI_PRESS_POWER_NOTHING) {
return 2;
}
return 1;
}
private void powerLongPress(long eventTime) {
final int behavior = getResolvedLongPressOnPowerBehavior();
Slog.d(TAG, "powerLongPress: eventTime=" + eventTime
- " mLongPressOnPowerBehavior=" + mLongPressOnPowerBehavior);
switch (behavior) {
case LONG_PRESS_POWER_NOTHING:
break;
case LONG_PRESS_POWER_GLOBAL_ACTIONS:
mPowerKeyHandled = true;
// 2025/9/25 18:04 wenyuanbo Add
Slog.d(TAG, "sleep 3s start++++");
try {
// 3000 milliseconds = 3 seconds
Thread.sleep(3000);
} catch (InterruptedException e) {
// Handle interrupt exceptions
Thread.currentThread().interrupt();
e.printStackTrace();
}
Slog.d(TAG, "sleep 3s End----");
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS_POWER_BUTTON, false,
"Power - Long Press - Global Actions");
showGlobalActions();
break;
case LONG_PRESS_POWER_SHUT_OFF:
case LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM:
mPowerKeyHandled = true;
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS_POWER_BUTTON, false,
"Power - Long Press - Shut Off");
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
mWindowManagerFuncs.shutdown(behavior == LONG_PRESS_POWER_SHUT_OFF);
break;



Y:\android13-20250818\frameworks\base\core\res\res\values\config.xml
Z:\rk-android13-20250818RD-RK3588-MID\frameworks\base\core\res\res\values\config.xml
<!-- Maximum velocity to initiate a fling, as measured in dips per second. -->
<dimen name="config_viewMaxFlingVelocity">8000dp</dimen>
<!-- Amount of time in ms the user needs to press the relevant key to bring up the
global actions dialog -->
<integer name="config_globalActionsKeyTimeout">500</integer>
<!-- Amount of time in ms the user needs to press the relevant keys to trigger the
screenshot chord -->
<integer name="config_screenshotChordKeyTimeout">0</integer>
修改为:
<!-- Maximum velocity to initiate a fling, as measured in dips per second. -->
<dimen name="config_viewMaxFlingVelocity">8000dp</dimen>
<!-- Amount of time in ms the user needs to press the relevant key to bring up the
global actions dialog -->
<integer name="config_globalActionsKeyTimeout">3000</integer>
<!-- Amount of time in ms the user needs to press the relevant keys to trigger the
screenshot chord -->
<integer name="config_screenshotChordKeyTimeout">0</integer>
rootroot@rootroot-X99-Turbo:~/rk-android13-20250818RD-RK3588-MID/frameworks$ grep config_globalActionsKeyTimeout . -R
grep: ./wilhelm/tools/hashgen/OpenSLES_IID.c: No such file or directory
grep: ./wilhelm/tools/hashgen/interfaces.c: No such file or directory
grep: ./native/include/private/binder: No such file or directory
./base/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java: com.android.internal.R.integer.config_globalActionsKeyTimeout);
Binary file ./base/tools/aapt2/integration-tests/CommandTests/android-28.jar matches
./base/core/java/android/view/ViewConfiguration.java: com.android.internal.R.integer.config_globalActionsKeyTimeout);
./base/core/res/res/values/config.xml: <integer name="config_globalActionsKeyTimeout">500</integer>
./base/core/res/res/values/symbols.xml: <java-symbol type="integer" name="config_globalActionsKeyTimeout" />
./base/boot/hiddenapi/hiddenapi-max-target-o.txt:Lcom/android/internal/R$integer;->config_globalActionsKeyTimeout:I
rootroot@rootroot-X99-Turbo:~/rk-android13-20250818RD-RK3588-MID/frameworks$
参考资料:
百度:<integer name="config_longPressOnPowerDurationMs">500</integer>
CSDN: <integer name="config_longPressOnPowerDurationMs">
RK3588 长按电源按钮打开关机对话框时间修改
https://blog.csdn.net/netwalk/article/details/16356935
设置Android设备长按Power直接关机
Android4.0.3版本中长按Power按键跳出关机选项对话框;但在一些项目会需要长按Power直接关机而不是跳出关机选项对话框。Android4.0.3源码中并无长按直接关机的代码及选项,因此需要我们自己添加。
思路及实现:
参照长按Power按键跳出的关机对话框及关机流程部分代码,可以发现涉及到长按Power按键,关机及需要实现我们需要的功能的文件集中在:
framework/base/core/res/res/values/config.xml
framework/base/policy/src/com/android/internal/policy/impl/PhoneWindowManger.java
具体修改如下:
第一步:
在PhoneWindowManager.java中
添加static final int LONG_PRESS_POWER_OFF_NOW = 3;
【看来CSDN的AI推荐算法还行。就是这里了!】
_integer name=config_globalActionsKeyTimeout__2500__integer - CSDN文库.mhtml
https://blog.csdn.net/mafei852213034/article/details/109818131
Android关机重启流程
【付费】
https://rjdeng.blog.csdn.net/article/details/48826579
长按Power键关机从Framework到Kernel
https://blog.csdn.net/morecrazylove/article/details/141095435
基于RK3568 Android11 移除长按电源按键弹窗的对话框中的 [关机] 和 [紧急呼救] 选项(详细分析)
https://forlinx-book.yuque.com/rh74yu/rkword/smyx368w5ey95261
这边只找到了这个,和您的需求不太一样,是参考的我们的方法吗
https://blog.csdn.net/MyLovelyJay/article/details/129200991
长按电源按钮打开关机对话框时间修改
你可以参考这个网上的修改方案
DeepSeek:
在JAVA程序中延迟3秒
在Java程序中延迟3秒,我们可以使用Thread.sleep()方法。但是要注意,Thread.sleep()可能会抛出InterruptedException,所以我们需要处理这个异常,通常是用try-catch块包围起来。
另外,需要注意的是,Thread.sleep()的参数是毫秒,所以3秒就是3000毫秒。
下面是一个简单的示例,展示如何在当前线程中延迟3秒。
在Java程序中延迟3秒有多种实现方式,以下是几种常见的方法:
- 使用 Thread.sleep()(最常用)
java
try {
// 延迟3秒(3000毫秒)
Thread.sleep(3000);
} catch (InterruptedException e) {
// 处理中断异常
Thread.currentThread().interrupt();
e.printStackTrace();
}
- 使用 TimeUnit(推荐)
java
import java.util.concurrent.TimeUnit;
try {
// 更易读的方式,支持多种时间单位
TimeUnit.SECONDS.sleep(3);
// 或者
TimeUnit.MILLISECONDS.sleep(3000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
- 使用 ScheduledExecutorService(适合定时任务)
java
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
// 延迟3秒后执行任务
scheduler.schedule(() -> {
System.out.println("延迟3秒后执行的任务");
}, 3, TimeUnit.SECONDS);
// 记得关闭线程池
scheduler.shutdown();
- 使用 CompletableFuture(异步延迟)
java
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
CompletableFuture.delayedExecutor(3, TimeUnit.SECONDS)
.execute(() -> {
System.out.println("延迟3秒后异步执行");
});
- 封装成工具方法
java
public class DelayUtil {
public static void delaySeconds(int seconds) {
try {
TimeUnit.SECONDS.sleep(seconds);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new RuntimeException("延迟被中断", e);
}
}
public static void delayMilliseconds(long milliseconds) {
try {
TimeUnit.MILLISECONDS.sleep(milliseconds);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new RuntimeException("延迟被中断", e);
}
}
}
// 使用示例
DelayUtil.delaySeconds(3); // 延迟3秒
完整示例
java
public class DelayExample {
public static void main(String[] args) {
System.out.println("程序开始: " + System.currentTimeMillis());
try {
// 延迟3秒
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
System.out.println("3秒后: " + System.currentTimeMillis());
}
}
注意事项
异常处理:Thread.sleep() 会抛出 InterruptedException,必须处理
精度问题:睡眠时间不是绝对精确的,实际延迟可能略有偏差
线程阻塞:sleep方法会阻塞当前线程,在UI线程中使用会导致界面卡顿
单位转换:推荐使用 TimeUnit,代码更清晰易读
推荐使用 TimeUnit.SECONDS.sleep(3),因为它比 Thread.sleep(3000) 更易读和维护。
