定时任务调度 — AlarmManager、WorkManager 与 JobScheduler
Android 后台困境
Android 对后台进程的管控逐年加强,定时任务面临三大挑战:
| Android 版本 | 后台限制 | 影响 |
|---|---|---|
| 7.0 | Doze 模式 | 屏幕关闭后延迟任务 |
| 8.0 | 后台执行限制 | 后台服务受限 |
| 9.0 | App Standby | 不常用应用延迟任务 |
| 10+ | 更严格的后台 | 定时可能大幅延迟 |
| MIUI/ColorOS | 厂商额外限制 | 定制系统限制更多 |
AutoJs6 v6.7 新增的「定时任务调度引擎」设置就是为了解决这个问题。
三种调度引擎
| 引擎 | 精度 | 说明 | 推荐场景 |
|---|---|---|---|
| AlarmManager | ⭐⭐⭐⭐⭐ | Android 原生闹钟机制,最精确 | 需要精确时间点触发 |
| WorkManager | ⭐⭐⭐ | Jetpack 库,弹性时间 | 可以延迟执行的任务 |
| JobScheduler | ⭐⭐⭐⭐ | Android 5+ 原生 API | 原生、无需额外依赖 |
AlarmManager
优点:
- 最精确(通常误差 < 1 分钟)
- 系统级调度,即使应用被杀也能触发
- 支持 exact alarm(精确闹钟)
缺点:
- 从 Android 12+ 开始精确闹钟需要 SCHEDULE_EXACT_ALARM 权限
- 部分厂商 ROM 可能限制
推荐:
- 定时签到(每天 08:00 必须触发)
- 时间敏感的自动化
WorkManager
优点:
- Jetpack 官方库,保证最终执行
- 支持约束条件(充电时、网络可用时)
- 电池优化友好
缺点:
- 弹性执行,可能延迟
- 不保证精确时间
推荐:
- 可以延迟的后台任务
- 数据同步、清理缓存等
JobScheduler
优点:
- Android 5+ 原生 API
- 系统会合并类似任务、节省电量
缺点:
- 受系统条件限制(充电、空闲、网络)
- 触发时间可能大幅延迟
推荐:
- 非紧急的定期检查
- 后台同步、巡检
设置方法
AutoJs6 → 设置 → 无障碍 → 定时任务调度引擎
可选:
- AlarmManager(默认推荐)
- WorkManager
- JobScheduler
- 自动选择(系统根据版本选择)
定时触发方式
setTimeout — 单次延迟
// 延迟执行(脚本活跃时生效)
setTimeout(() => {
console.log("10 秒后执行");
}, 10000);
setInterval — 循环执行
// 循环执行(脚本活跃时生效)
let timer = setInterval(() => {
console.log("每秒执行一次");
}, 1000);
// 停止
clearInterval(timer);
AutoJs6 计划任务(跨启动)
// AutoJs6 有内置的计划任务功能
// 可以在 AutoJs6 应用内配置,或用脚本 API
// 设置一次性定时(会写入系统调度器)
// scheduler.scheduleOnce(targetTime, scriptPath);
// 设置循环定时
// scheduler.scheduleDaily(hour, minute, scriptPath);
// 设置间隔定时
// scheduler.scheduleInterval(intervalMinutes, scriptPath);
实战:定时签到脚本(最常见场景)
问题
"我想每天早上 8 点自动签到,但有时候脚本没触发。"
原因分析
| 原因 | 发生概率 | 解决 |
|---|---|---|
| AutoJs6 进程被系统清理 | ⭐⭐⭐⭐ | 加入电池白名单 |
| 定时引擎被厂商 ROM 限制 | ⭐⭐⭐⭐ | 用 AlarmManager |
| AutoJs6 没开机自启 | ⭐⭐⭐ | 开启开机自启 |
| 定时任务本身没注册 | ⭐⭐ | 重新注册定时 |
完整配置
步骤一:AutoJs6 设置
1. 设置 → 定时任务调度引擎 → 选 AlarmManager
2. 设置 → 开机自启 → 开启
3. 设置 → 电池优化白名单 → 加入 AutoJs6
4. 厂商自启动管理 → 加入 AutoJs6
步骤二:脚本启动自检
// 签到脚本开头
// 检查无障碍服务
if (!auto.state) {
console.error("无障碍服务未开启");
// 尝试自动开启
auto.openAutoSetting();
exit();
}
// 检查定时引擎状态
// (如果是后台定时触发,AutoJs6 会自动处理)
// 主逻辑
function dailyCheckIn() {
let today = new Date().toDateString();
let lastRun = storage.get("lastCheckInDate", "");
if (today === lastRun) {
console.log("今天已经签到过了");
return;
}
console.log("开始签到: " + today);
// ... 签到逻辑 ...
storage.put("lastCheckInDate", today);
console.log("签到完成");
}
dailyCheckIn();
步骤三:注册定时(AutoJs6 应用内)
AutoJs6 → 计划任务 / 定时任务
→ 新建计划任务
→ 选择签到脚本
→ 设置每天 08:00 触发
→ 保存并启用
步骤四:验证
1. 手动运行脚本 → 确认签到正常
2. 强制关闭 AutoJs6 进程
3. 等待定时时间(可以设个近的时间测试)
4. 检查定时是否触发 → 看 AutoJs6 日志
5. 如果没触发 → 检查电池白名单和厂商限制
后台存活策略
加入电池优化白名单
// 打开系统电池优化设置
try {
let intent = new Intent();
intent.setAction("android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS");
intent.setData(Uri.parse("package:" + context.getPackageName()));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
} catch (e) {
toast("请手动在系统设置中关闭电池优化");
}
前台服务保持存活
v6.7 新增多个与前台服务相关的设置:
// 设置 → 无障碍 → 前台服务类型
// 配置前台服务,让系统把 AutoJs6 视为"活跃服务"
// 设置 → 重启策略
// 配置 AutoJs6 异常退出后的快速重启
厂商 ROM 特殊处理
| 厂商 | 额外设置 |
|---|---|
| 小米 / Redmi | 安全中心 → 自启动 → 开启 AutoJs6;电量管理 → 无限制 |
| 华为 / 鸿蒙 | 手机管家 → 自启动管理 + 关联启动 |
| OPPO | 设置 → 电池 → 允许应用自启动;后台冻结 → 关闭 |
| Vivo | i管家 → 自启动管理 + 后台运行 |
| 一加 | 设置 → 电池 → 优化 → 无优化;锁定后台 |
锁定后台
最近任务 → 长按 AutoJs6 → 锁定(防止一键清理)
定时调试技巧
// 脚本开头添加调试日志
console.log("定时触发: " + new Date().toLocaleString());
console.log("无障碍服务: " + (auto.state ? "正常" : "断开"));
// 如果是定时触发,检查来源
// let fromScheduler = scheduler.isScheduled();
// console.log("定时触发: " + fromScheduler);
手动测试定时
# 电脑端 adb 模拟定时触发
adb shell am broadcast -a action.autojs6.schedule_run --es script "/sdcard/checkin.js"
进阶:多种调度引擎混合使用
// 不同场景用不同引擎
// AlarmManager:精确时间点触发(签到必须准点)
// WorkManager:弹性时间任务(清理可以等)
// JobScheduler:省电任务(巡检)
// 脚本中根据任务类型选择
function scheduledRun() {
let task = storage.get("currentTask", "");
switch (task) {
case "checkin":
// 必须准点
scheduler.useAlarmManager();
break;
case "cleanup":
// 可以等
scheduler.useWorkManager();
break;
case "sync":
// 最省电
scheduler.useJobScheduler();
break;
}
}