有用户问:App 运行着,过一会儿屏幕就自己黑了、锁屏了;或者一熄屏,计时停了、蓝牙和网络数据也收不到了。怎么让 App 不休眠?
能实现。 先分清你要的是哪一种「不休眠」,两种做法完全不同:
| 你要的 | 典型场景 | 用什么 | 需要拓展吗 |
|---|---|---|---|
| 屏幕一直亮着,App 在前台时不熄屏、不锁屏 | 看数据面板、计时器、导航、展示屏 | 内置屏幕控制的保持常亮 | 不需要 |
| 熄屏或切到后台后程序照样跑 | 后台计步、持续记录、保持蓝牙或网络连接 | KeepAwake 保持唤醒拓展的部分唤醒锁 + 前台通知 | 需要 |
多数人要的其实是第一种,一个属性就够了;第二种要和手机的省电机制「商量」,下面分开讲。
准备
拖一个屏幕控制(在「界面高级」分类)、一个计时器(计时间隔 1000,勾选「启用计时」「一直计时」)、一个开关和两个标签。
实验三再加三个按钮(按钮_开始、按钮_停止、按钮_电池)。
实验一:屏幕一直亮着
打开 App 就保持常亮,开关随时切换:
when Screen1.Initialize() {
屏幕控制1.KeepScreenOn = true
开关1.On = true
}
when 开关1.Changed() {
屏幕控制1.KeepScreenOn = 开关1.On
标签1.Text = choose(开关1.On, "屏幕常亮:开", "屏幕常亮:关")
}
跑起来看:先在手机「设置 → 显示 → 自动锁屏」里设成 30 秒,打开 App 不碰屏幕,等一分钟屏幕仍然亮着; 把开关关掉,30 秒后屏幕正常熄灭。
说明:
- 只在本 App 位于前台时生效,切到别的 App 或按电源键熄屏后就交还给系统,不会一直耗电;
- 不需要任何权限;小米 MIUI 等系统会在某些时候悄悄清掉常亮标志,屏幕控制组件已经做了加固(回到前台和每隔 10 秒自动重设);
- 也可以不写积木,直接在属性面板勾选「保持常亮」。
实验二:先看看熄屏后程序是不是真的停了
「熄屏后收不到数据」到底是不是程序停了,先用一个计数实验看清楚:计时器每秒加一,同时算出实际经过了多少秒,两个数一比就知道。
global 计数 = 0
global 开始时间 = 0
when 计时器1.Timer() {
if (开始时间 == 0) {
开始时间 = 计时器1.SystemTime()
} else {
计数 = 计数 + 1
}
标签2.Text = join("计数 ", 计数, " 次,实际经过 ", round((计时器1.SystemTime() - 开始时间) / 1000), " 秒")
}
跑起来看:前台亮屏时两个数一样。按电源键熄屏,等 5 分钟再点亮屏幕:多数手机上「计数」明显少于「实际经过」的秒数, 差出来的就是程序被系统冻住的时间。这不是 App Inventor 的问题,是安卓为了省电,熄屏一段时间后会让 CPU 休眠、冻结后台程序(Doze 机制)。
计时器的「一直计时」只管 App 切到后台时计时器还触发不触发,管不了 CPU 休眠。要真正不停,看实验三。
实验三:熄屏后继续运行
用 KeepAwake 保持唤醒拓展(下载页里有 .aix,导入即可)。 这个实验必须编译成 APK 安装后测试:拓展要启动前台服务,服务得写进安装包的清单文件,AI 伴侣里没有,在伴侣里点了不会有效果。 它申请一个部分唤醒锁:屏幕可以灭,CPU 不睡;同时自动启动一个前台服务,在通知栏放一条常驻通知, 这是安卓对「长时间后台运行」的硬性要求,告诉用户这个 App 正在后台工作。
when 按钮_开始.Click() {
UrsAI2KeepAwake1.NotificationTitle = "正在计数"
UrsAI2KeepAwake1.NotificationText = "熄屏后也会继续"
UrsAI2KeepAwake1.AquirePartialWakeLock()
标签1.Text = choose(UrsAI2KeepAwake1.IsIgnoringBatteryOptimizations, "后台保持中", "后台保持中(电池优化未关闭,先点「电池」)")
}
when 按钮_停止.Click() {
UrsAI2KeepAwake1.ReleaseWakeLock()
标签1.Text = "已停止保持"
}
when 按钮_电池.Click() {
UrsAI2KeepAwake1.OpenBatteryOptimizationSettings()
}
跑起来看:
- 先点「电池」,打开系统的电池优化设置页,找到本 App 设为「不优化」(有的手机叫「无限制」);
- 点「开始」,标签显示「后台保持中」(如果带着「电池优化未关闭」的提示,回到第 1 步),通知栏出现「正在计数」的常驻通知;安卓 13 及以上要先在系统设置里给 App 打开通知权限,否则通知出不来;
- 按电源键熄屏,等 5 分钟再亮屏:「计数」和「实际经过」的秒数基本一致,说明熄屏期间程序一直在跑;
- 点「停止」释放唤醒锁,通知消失,恢复正常省电。
要记得释放:唤醒锁会明显增加耗电,只在确实需要的时间段持有,用完就调用「ReleaseWakeLock」。 只是偶尔定时做一件事(比如每小时提醒一次),不需要 CPU 一直醒着,用内置的定时任务更省电。
实验四:国产手机还要改两个设置
小米、华为、OPPO、vivo 等在安卓的基础上又加了一层省电管理,即使拿了唤醒锁,也可能在熄屏一段时间后被「一键清理」掉。 实验三的计数如果还是对不上,在手机设置里找到这个 App:
- 省电策略 / 电池使用:设为「无限制」或「允许后台高耗电」;
- 自启动 / 应用启动管理:允许自启动、允许后台活动;
- 在多任务界面把 App 卡片下拉锁定,防止被一键清理。
各品牌的入口不同,详见息屏与后台运行问题解决方案的「省电设置指导」。改完再做一遍实验三,计数就能对上了。
常见问题
| 现象 | 原因 | 解决 |
|---|---|---|
| 勾了「保持常亮」屏幕还是会灭 | 切到了别的 App,或按了电源键 | 常亮只在本 App 前台时有效,这是正常的 |
| 常亮过一会儿失效(小米手机) | MIUI 悄悄清掉了常亮标志 | 用屏幕控制组件(已加固);手机里给 App 设「省电策略:无限制」 |
| 熄屏后计时器、蓝牙、网络停了 | CPU 休眠,程序被冻结 | 用实验三的唤醒锁 + 前台通知 |
| 点了「开始」通知栏没有通知 | 安卓 13+ 没给通知权限 | 系统设置里给 App 打开通知权限 |
| 在 AI 伴侣里点「开始」没反应 | 前台服务要写进安装包清单,伴侣里没有 | 编译成 APK 安装后测试 |
| 拿了唤醒锁还是被杀 | 厂商省电策略 | 做实验四的设置 |
| 很耗电 | 唤醒锁一直没释放 | 不用时调用「ReleaseWakeLock」;只是定时提醒改用定时任务 |
平台说明
- 屏幕常亮:安卓、鸿蒙都支持,积木写法相同(鸿蒙由系统窗口保持常亮,不存在被悄悄清掉的问题)。
- 熄屏后继续运行:KeepAwake 是安卓拓展,只能用在安卓上;鸿蒙对后台运行管控更严,需要长时任务授权,目前没有对应组件。
相关文档
- 屏幕控制:保持常亮、状态栏颜色、全屏、截图
- KeepAwake 保持唤醒拓展、WakeLock 拓展
- 息屏与后台运行问题解决方案
- 定时任务:定时触发,App 没开着也能到点提醒
扫码添加客服咨询