Matrix 精选
Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。
文章代表作者个人观点,少数派仅对标题和排版略作修改。
试想一下这样的情景:
- 夜里,你不想让手机上的通知惊扰了你的美梦,那你可以设置一个「每天晚上十二点关闭声音,每天早上八点钟开启声音」这样一个简单的命令。
- 经常走着走着就没有 Wi-Fi,切换到数据流量却没有察觉?经常连上了 Wi-Fi 却不能很方便地查看连的是哪一个?有了 Automate,它可以在切换时弹出浮窗提醒你。
- 想要把读到的文章收藏到 Pinboard 或者 Instapaper 中时,Automate 可以让「收藏」这一动作显得非常优雅:只需要复制下链接,文章即可自动保存到书签网站。
- 出门没有带手机,临时要用验证码怎么办?如果在 Automate 中配好了「收到短信时自动同步到 IM 应用」,你直接就可以在电脑上查看短信了。
- 满屋子找不到手机,却又开了静音模式?只要发送一条特定内容的短信「你在哪里」,Automate 识别之后会把你的手机音量开到最大,然后开始发出铃音。
第一次见到上述流程,很多人可能都会觉得看上去「很酷」。自动化一直是玩机社区乐此不疲的话题,在 iOS 上我们有捷径和捷径社区,在 Android 上很多人也许会想到 Tasker —— 那个每每下载安装决定大干一场,却往往都无疾而终「从入门到放弃」的传奇应用。
其实 Android 上的自动化可以不用这么难,选择也远非 Tasker 这一种。
Automate:流程可视化,所见即所得
Automate 是我自己在用的方案,功能方面它不输 Tasker,可视化流程则有效降低了自己动手操作的门槛。
诚如它的名字所言,Automate 想要让你的 Android 设备「自动化」地完成任务。为了实现这个小目标,Automate 拥有各种各样的能力,它既可以充分调用 Android 设备的传感器和其他硬件,也可以直接监听并控制系统中的设置与事件。
上面左图展示了 Automate 中的一些模块,中图是「调整音量」模块的配置,右图则是流程的表现形式。
Automate 采用类似「流程图」的编写方式,可谓「所见即所得」。根据自己构想,选取合适的功能模块,按顺序排好,并进行简单的配置,一个自动化流程就完成了。
下图展示了前面所说的第 5 种情景,使用短信来寻找手机。可以看到,我一共使用了 6 个模块就完成了这项工作。这个流程非常便于理解:首先接收 SMS 短信,如果包含「你在哪里」就取消静音、调高音量到 100、播放声音文件。就这么简单。
最佳实践——快速收藏文章
为了进一步展示 Automate 的实力,除了上面提到的「找手机」,这里我们不妨再思考另一个需求:如何收纳你曾阅读的网页、文章,如何更加方便地「点击即收藏」,把它们归于一处?
作为 Android 上最好用的自动化工具之一,Automate 以十分清晰的「流程图」方式,为我们方便而快速地「收藏文章」提供了极好的解决方案。
挑选书签托管服务
首先我们要解决的「收藏放哪里」的问题。
书签管理的方式有很多,用 IE 的时候,我们就有「收藏夹」的说法;但我要是想换一台电脑,收藏夹迁移就变得很麻烦,于是许多浏览器又有了「账户同步」的功能。不过说来说去,浏览器书签操作方便,在同步、展示、整理等方面还是比较局限。
我们不妨看看现目前比较流行的几个在线书签服务:成都的 Diigo 一直面向海外客户,年费 40 刀,不仅可以存档网页,还可以进行批注;Pinboard 极简的网页设计吸引了非常多的用户,目前基础年费 11 刀,也可以花 20 刀来保存网页正文。
一众「稍后阅读」服务则从另一个角度提供了解决方案。
Pocket 和 Instapaper 都支持自动获取网页全文,并可以在手机上离线下载,这一方面在流量费用昂贵的当年为「刷手机」提供了便利,另一方面由于读过的网页会一直保留,它们也逐渐成为许多人保存网页的工具,而更多的人把网页丢进「稍后阅读」,结果就「再也不读」了。
而 Evernote、Onenote 等笔记服务似乎可以算作独辟蹊径了,它们纷纷推出了全平台的浏览器插件,剪辑网页正文并保存下来,这件事反而成为了很多人使用笔记服务的最大用途。
准备基于 HTTP 的 API 接口
要实现自动化,一套可供调用的 API 也是必不可少的。Diigo、Pinboard、Pocket 和 Instapaper 都有比较完善的 API 可供调用,并且都只需要借助 HTTP 来实现,非常方便。
我们今天以 Instapaper 为例:它的 API 分成 简单版 和 完整版 两套,如果只是需要「添加书签」,使用简单版足矣。具体而言,当需要收藏一个书签时,我们可以直接调用如下的 URL:
https://www.instapaper.com/api/add
这个 API 通过 POST 方法使用,消息体包含两个参数:
url
,也就是需要收藏的文章地址,必须填写title
,可选,用来指定文章的标题,如果没有指定,那么 Instapaper 会自动去爬取文章标题
同时,为了表明身份,我们会加入一段验证,通过 HTTP 头传入我们的账户名称和密码。
总体设计:三纵合一
在 Automate 中最终编辑完成的工作流大概长这样:
这里一共有三个入口,也就是三个「Flow beginning」,不过经过处理之后,最终汇集到同一个分支流中,这个分支流的主要功能是向服务器发出请求并处理应答。
这三个入口分别处理:
- 直接剪贴板内容匹配触发
- 通过下拉通知栏触发
- 通过系统分享菜单触发
新建一个工作流
安装好 Automate 后,点击主界面右上角的加号,新建一个工作流。在工作流编辑界面,点击左上角的菜单可以打开所有结点的列表来供选择,
当然,一般使用「搜索」的方式来找结点……结点归类很迷,不大好找。
第一纵:复制即保存
这个入口我在 Android 上用得非常频繁。在 iPhone 上使用 Workflow 时,由于不能后台监控剪贴板,所以无法实现。
而在 Android 这里最终实现的效果是,当我在少数派 App 的分享中选择「复制链接」之后,文章就直接保存了。
主要的入口部分代码是:
结点 17 指示了当前工作流的一个入口。为了便于后面代码的复用,入口是可以设置多个的,启动时可以选择其中一个或者多个入口。
每一个入口都可以设置名称,方便识别,也可以指定桌面快捷方式直接启动。
结点 18 用于等待剪贴板的修改事件。
在 Automate 中,结点一般分为两类,一类是立即执行的,一类是由监听事件触发的。事实上,同一个结点往往兼具了这两种形式。比如这个剪贴板的结点,既可以立即获取当前剪贴板内容并执行下去,也可以设定成在剪贴板发生变化的时候才执行。
涉及到输出时,我们可以直接指定一个变量,输出会自动赋值给这个变量。
这里我们启动名为「copy」的入口之后,就开启对剪贴板修改时间的监听。如果剪贴板发生了改变,那么把修改后的剪贴板内容放入到名为「shared_text」的变量中,并启动一个新的分支流,来判断是否需要保存这个书签。
结点 20 启动了一个新的分支流,NEW 出来的分支流会独立执行,OK 引出的线条会在启动分支流之后立即执行下去,这样相当于开启了同时执行的父子两个流。
结点 21 采用正则表达式判断剪贴板中是否包含了我们所需的网址。我这里以少数派、知乎和微信公众号为例,具体的格式可以先查看每个应用分享出来的网址。
在结点 21 中,我使用了 match 函数 来判断字符串是否匹配。这个函数的原型为:
array matches(value, regex)
在正则式的开头可以设置标识位,来指定正则式的执行方式。这里 (?ms) 可以理解成对多行文本的适应,因为很多应用复制出来的链接并不只是一个网址,而会带着文章的摘要。
具体标识位的用法可以看 官网文档。
至此,通过复制直接保存书签的前置工作就完成了,现在书签地址保存在 shared_text 变量中,供之后的网络请求来调用。
第二纵:灵活的下拉菜单按钮
由于不可能对剪贴板中的所有地址都直接保存,这时我们就需要好好利用下拉菜单中的快捷开关了。基本的原理是:先把网址复制到剪贴板中,然后触发这个工作流,令其读取剪贴板并保存书签。
入口部分的代码是:
结点 8 是入口结点,取名为「clipboard」。结点 16 配置了一个下拉菜单按钮。
自定义下拉菜单按钮的功能是在 Android 7 的时候引入的,不过时至今日也没有多少应用支持。配置完之后,需要手动去下拉菜单的「编辑」选项中把这个按钮激活。
结点 9 选择了「立即」获取剪贴板内容,并同样把网址放到 shared_text 变量中。
结点 10 创建了一个新的分支流,并循环回结点 16,等待下拉菜单按钮点击事件再次触发。
和前面一个入口一样,这里也为下一步网络请求提供了保存于 shared_text 变量中的一个地址。
第三纵:直接走系统分享菜单
最后,系统分享菜单其实也是一个不可或缺的入口。
不过需要注意的是,现在 Android 应用很多都会采用一套自己的分享菜单实现,比如少数派的 App 会在点击「更多」后触发系统分享菜单,而像微信公众号则根本不允许调用系统分享菜单,只能在它自己适配的几个分享选项中选择。
系统分享的效果如下:
入口代码也非常简单:
结点 1 和 7 自不必说,结点 2 配置了一个系统分享菜单的选项,并指定了在分享内容为文本时显示。
系统分享的第一个选项 TITLE 可以指定在分享时的菜单中显示的提示语。同样的,分享获得的文本内容会保存到 shared_text 变量中。
合一:网络请求和应答处理
现在前面三个入口都使用了一个 shared_text 变量,并都通过「Fork」结点引出了一个新的分支流。
网络请求是所有分支都合用的部分,代码如下:
别看我排成了 3 列,其他它可以看成一个非常简洁的单线顺序结构。入口是中间的 22 号结点,为了可能出现的网络异常,我这里做了个异常捕获,
要是抛出异常,可以自动重试三次。失败了会在结点 23 中打印信息,然后在结点 3 中重新发起网络请求。
结点 23 用于调用系统的 Toast 接口来显示信息,Automate 中字符串的组合符号用的是 ++ 两个加号。
结点 3 用于网络请求,网址、请求方法和请求体都根据 API 来填。这个结点支持 HTTP BASIC AUTH,添加用户名和密码后会保存到系统账户中,并可以在多个 Automate 脚本中共享。
最后输出的是应答码和应答体,分别保存到一个变量中。
收到的数据类似这样:
{"bookmark_id": 1209375694}
结果显示了一个书签编号,通过 https://www.instapaper.com/read/1209375694 可以直接访问到所保存的页面。
把结果使用 jsonDecode 函数 进行解析,并把 bookmark_id 的值保存下来,分别用于日志记录和屏幕提示。
结点 5 用于设置变量,这个结点比较有趣,输出在前,输入在后,大概是为了满足「赋值」这个概念,与一般的编程语言相仿。
结点 6 会调用 Automate 的日志,记录后方便查阅。结点 4 依然是一个 Toast 结点,用于在屏幕上显示简单的提示文本。
大功告成
好,现在可以保存编辑后的流,回退一步到流的设置页面,点击「Start」按钮。
如果没有获取到全部结点所需的权限,那么此时会弹出请求,选择「Grant」后,应用会唤起 Google Play 来安装相应的权限插件(Automate 的权限以插件的形式提供,一个新的权限就是安装一个应用,移除一个权限就是把它卸载掉)。
安装完成后再回来点击「Start」按钮,就可以看到入口的选择菜单了,这时我们可以选择需要激活的入口,或者直接点击「All」激活全部入口。
现在,就可以使用前面所说的三种入口,分别来试一试啦。
小结
Automate 作为一款功能强大的自动化工具,需要的权限较多,并且需要我们在系统中进行设置来让它们保持运行,如果你在国内厂商的定制 ROM 上遇到问题,不妨按照少数派的 文章 进行排查。
Automate 提供免费下载使用、没有广告,我非常建议从 Google Play 上下载 官方版本的应用,如果你觉得好用,还可以通过 2.99 美元的内购移除 30 个结点的限制。
> 下载少数派 客户端、关注 少数派公众号,发现更多实用效率技巧 😃
> 特惠、好用的硬件产品,尽在 少数派 sspai 官方店铺 🛒