跳到主要内容

第 09 课 · 恢复例程

屏幕不对时,别往前瞎猜——恢复到已知状态,或明确说你做不到。

问题

长时自动化一定会落到意料之外的界面:插页、岔路、它从未计划过的页面。从那里盲目前进只会雪上加霜。你要的是一个能可靠回答一个问题的例程:

带我回仪表盘——或告诉我你不行。

Android 上"退回安全地带"的万能工具是 BACK 键。纪律在于有界地使用它:检查、按键、等待、再检查——在固定轮数后以干净的失败放弃,绝不无限循环。

你将学到

  • Key Press(按键)节点。
  • 检查 → 按键 → 等待 → 再检查的阶梯。
  • 把多个出口汇聚到共享结局。
  • 为什么恢复必须有界

开始之前

流程

两次尝试让这个流程高得放不进一张看得清的截图,所以这里一张图一次尝试,全缩放:

第 09 课,第一次恢复尝试

第一次尝试:① Start ② "在仪表盘上吗?"——如果是,就顺着左侧那条长绿线立刻离开 ③ 按一次 BACK ④ 一次沉降 Wait ⑤ 再问一遍。

第 09 课,第二次尝试与两个结局

第二次尝试与结局:①–④ 把同样的 BACK · 沉降 · 复查形状再向右挪一级重复一遍,然后 ⑤ Stop: on the dashboard 收拢所有成功路径,⑥ Stop: could not recover 是唯一那个诚实的失败结局。

阶梯形状就是设计本身:每向右一级是多一次恢复尝试,而每条绿色 Success 连线都汇向唯一的圆满结局。

动手构建

  1. 新建流程。"已知界面"的地标是 Practice App 的 logo(每页左上角的 "M" 标志)——截取一次作模板。好地标只出现在目标界面、别处没有。
  2. 添加三个一模一样的 Find Image 检查 On the dashboard?——同一模板,timeout 1500 ms(是提问,不是等待——第 04 课的规则)。
  3. 其间插入:Key = BACKKey Press 节点,每个后面跟一个 Wait 600 ms(理由:after BACK)。
  4. 两个结局:Stop: on the dashboard(success)与 Stop: could not recover(failure,消息写明放弃点)。
  5. 按图连出阶梯——每个检查的 Success 都指向同一个成功 Stop。
  6. Save,Auto Layout。

为什么这样构建

选择理由
任何 BACK 之前先检查已经在家?零按键,约 300 ms 完事
每次 BACK 后等待界面有动画;立刻再查读到的是旧帧
每次 BACK 后再检查每次按键都要证明有进展——不打盲连发
恰好两次,然后放弃在应用根界面,BACK 会退出整个应用——无限按 BACK 只会更糟
一个共享成功 Stop"怎么回的家"不重要;"我到家了"才重要

为什么不用循环? 你完全可以把它写成 2 轮循环——第 12 课里类似逻辑就是循环形态。摊平之后,阶梯一眼可读,而且以后每一级都能分化(比如第二次换个按键)。两次尝试,摊平更清楚;五次,用循环。会选更易读的形状,本身就是这门课教的能力。

运行

  • 从仪表盘:第一个检查命中 → 一秒内 success,零按键。
  • 把模拟器导航到 verify.html 再运行:检查失败 → BACK(浏览器退回仪表盘)→ 等待 → 第二个检查命中 → success,一次按键。
  • 打开完全不同的应用再运行:两次按键、三个检查全失败 → failure · Not on a known screen after 2 BACK presses——调用方能处理的诚实结局。

最佳实践

  • 地标只选目标界面独有之物。 Logo 和固定界面框架胜过任何出现在多个页面的东西。
  • 检查用短超时——每个检查是一次提问;三个 1500 ms 的问题在放弃路径上最多花 4.5 秒。
  • 导航按键之后永远等待。
  • 给每个恢复设界。 失败 Stop 不是悲观,而是让这个流程可以被任何地方安全调用的契约
  • 这个流程是你第一块真正的积木——第 11、12 课把它当函数调用。

常见错误

错误后果修复
按 BACK 不再检查你不知道它有没有用每次按键后检查
无限 BACK 循环退出应用,然后在启动器里按 BACK固定次数 + 失败结局
地标出现在多个界面"恢复"到了错的页面换独特的地标
不等待再检查读到按 BACK 前的帧每次按键后 600 ms
检查超时太长放弃路径迟缓每个 1500 ms

故障排查

它报告已恢复,屏幕却不对。 地标不够独特——在别的页面命中了。选更专属的模板。

某个应用里 BACK 没反应。 有些界面拦截 BACK。这正是例程干净放弃的原因——调用方决定下一步(重启应用、通知人)。

从浏览器回来总要按满两次。 第一次落在动画中间。把第一个等待提到 800 ms。

小结

  • 恢复 = 检查 → 按键 → 等待 → 再检查,有界,配诚实的失败。
  • Key Press BACK 是"驶向安全"的万能一步;不设界它就成了隐患。
  • 恢复流程的失败结局是对未来所有调用方的承诺。

下一课

例程自身从不重复劳动——但你的流程在多次运行之间还会。第 10 课 · 记忆冷却给流程一份活得比单次运行更久的记忆,让"这事做过了"成为它知道的事。

另见:Key Press · Find Image · Sub Flow