Tasker Perform Task 子任务调用与 Stop Return 终止控制 实现函数化复用
函数化复用的需求
没有 Perform Task 时,如果两个 Profile 需要相同的动作序列,你只能在每个 Profile 的 Task 里各写一遍——复制粘贴、改一处漏一处。
Perform Task 解决了这个问题:它让一个 Task 调用另一个 Task 作为"子任务",支持传递参数和接收返回值。Tasker 的 Task 从"串行命令队列"进化成了可以互相调用的函数体系。
Perform Task 基础
基本用法
Perform Task → 目标 Task 名
执行效果:
- 暂停当前 Task
- 完整执行目标 Task(从头跑到尾)
- 返回当前 Task,从断点继续
传参
Perform Task 可以向目标 Task 传递命名参数:
Perform Task → 目标 Task 名
参数1:名字 = 值
参数2:名字 = 值
在目标 Task 里,参数以局部变量的形式自动可用:
- 调用方传了参数
Color = "red" - 被调用方的 Task 里直接用
%par1(第一个参数)或参数名变量
返回值
被调用 Task 可以通过 Return 动作为调用方返回一个值:
# 被调用 Task 里
Return → "处理完成"(或变量值)
# 调用方里
Perform Task → 子任务 → 返回值存入 %ReturnValue
Perform Task 实战:构建可复用函数库
示例一:统一的"省电模式"
多个 Profile 都需要"打开省电模式"的逻辑:
# 定义通用子任务:Toggle Power Save
Task:Toggle Power Save
参数:%Action = "On" 或 "Off"
If → %Action = On
Wifi → Off
Bluetooth → Off
Display Brightness → 最低
Screen Timeout → 15秒
Do Not Disturb → 完全静默
Else
Wifi → On
Bluetooth → On
Display Brightness → Auto
Screen Timeout → 2分钟
Do Not Disturb → Off
Endif
# Profile A:晚上自动省电
Enter Task:
Perform Task → Toggle Power Save → Action = On
# Profile B:电量低于 20% 省电
Enter Task:
Perform Task → Toggle Power Save → Action = On
# Profile C:充电时恢复
Enter Task:
Perform Task → Toggle Power Save → Action = Off
示例二:文件处理流水线
# 子任务:Process Single File
Task:ProcessFile
参数:%FilePath
1. Read File → %FilePath → %FileContent
2. If → %FileContent 匹配某种格式
# 处理逻辑
Return → 成功
Else
Return → 格式错误
Endif
# 主任务:批量处理
Task:BatchProcess
1. List Files → /sdcard/data/ → %FileList
2. For → %F In → %FileList1, %FileList2, ...
Perform Task → ProcessFile → FilePath = %F → 返回值 %Result
If → %Result != 成功
Notify → "%F 处理失败"
Endif
End For
Stop vs Return vs Goto Return
这三个 Action 都涉及"结束 Task 执行",但含义完全不同:
| Action | 效果 | 典型场景 |
|---|---|---|
| Stop | 立即终止当前 Task,不执行剩余任何 Action | 紧急退出、条件不满足时放弃 |
| Return | 从被调用的子任务返回到调用方(只在 Perform Task 调用的 Task 里有意义) | 子任务执行完毕后返回结果 |
| Goto Return | 跳到 Task 里预先标记的 Return 标签(灵活终止) | 需要"跳到结尾做清理工作再退出" |
Stop 的威力与风险
Stop 非常强大,但也要小心:
- Stop 不区分位置——If/Else 块内、For 循环内、嵌套 Perform Task 内,Stop 会终止整个当前 Task
- 如果 Task 是被 Perform Task 调用的子任务,Stop 会同时终止调用方(不会自动回退到调用方)
- 如果你只想终止子任务、让调用方继续,用 Return
推荐:子任务里用 Return,主任务里用 Stop。
Return 的正确用法
# 调用方
Perform Task → DoWork → 返回值 %Result
# Perform Task 会暂停在这里,等 DoWork 返回
# 子任务 DoWork
1. If → 参数缺失
Return → 参数错误(直接返回,不执行后续 Action)
Endif
2. 正常逻辑...
3. Return → 成功(正常返回)
Goto Return:最灵活的终止方式
Goto Return 让你可以在 Task 的某个位置做清理动作再退出:
Task:下载并解压文件
1. HTTP Request → 下载到临时目录
2. If → %HTTPCODE != 200
Notify → "下载失败"
Goto → Cleanup(跳到清理标签)
Endif
3. Unzip → 解压到目标目录
4. If → 解压失败
Notify → "解压失败"
Goto → Cleanup
Endif
5. Notify → "完成"
Label → Cleanup
6. Delete File → 删除临时文件(无论成功失败都执行清理)
进阶:递归调用
Tasker 的 Perform Task 可以递归——Task A 调用 Task B,B 又调用 A。但要小心死循环:
# 危险的递归
Task A → Perform Task B
Task B → Perform Task A(没有退出条件)
正确的递归需要明确的退出条件(通常通过变量递减实现)。
子任务的可见性
- 具名 Task(在任务列表选项卡里的)可以被任何 Profile 的 Enter/Exit Task 调用
- 匿名 Task(Profile 内嵌的)无法被外部 Perform Task 引用——没有名字
- 所以想做函数库的 Task,一定要命名
调试 Perform Task
- Perform Task 的调用关系可以在 Tasker 的运行日志里看到(菜单 → 数据 → 运行日志)
- 子任务的参数值和返回值都会记录
- 如果子任务执行异常,日志里会显示具体在哪一步中断
- 建议在开发阶段把日志级别开高一点,方便排查参数传递问题