AutoJs6 中文文档 下载 App

定时任务调度 — AlarmManager、WorkManager 与 JobScheduler

Android 后台困境

Android 对后台进程的管控逐年加强,定时任务面临三大挑战:

Android 版本后台限制影响
7.0Doze 模式屏幕关闭后延迟任务
8.0后台执行限制后台服务受限
9.0App 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 → 设置 → 无障碍 → 定时任务调度引擎

可选:

定时触发方式

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设置 → 电池 → 允许应用自启动;后台冻结 → 关闭
Vivoi管家 → 自启动管理 + 后台运行
一加设置 → 电池 → 优化 → 无优化;锁定后台

锁定后台

最近任务 → 长按 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;
    }
}