Tasker 与 Autojs 之间如何传递数据

原创内容,转载请注明出处

前言

前些天接触 Autojs 应用后,发现它的模拟点击效果(尤其是点击速度)要比 AutoInput 与 TouchTask 出色许多,于是便开始研究更多的 Autojs 用法。在此期间,我遇到 Tasker 与 Autojs 互相通信(可传递数据)的需求,相信这也是同时使用 Tasker 与 Autojs 的玩家会共同遇到的。如果它们之间能够互相通信,那么我们就可以很轻易地实现那些需要它们协同完成的功能。稍有经验的玩家会很自然地想到利用剪贴板或读写文件的方法来实现 Tasker 与 Autojs 之间的通信,除此之外,使用发送广播这一高级方法也能达到互相通信的目的。[1]

Tasker 向 Autojs 传递数据

注:若 Autojs 版本不低于 4.0.3 Alpha4,建议使用发送广播的方法来传递数据,效果会更好

Autojs 虽然可以通过读取剪贴板的内容获得由 Tasker 传递的数据,但该方法可靠性低,容易出错,不建议采用此法来传递数据。个人认为,通过读取文件内容获得传递的数据应该是一个既有效且可靠的方法,下面的内容是我具体的实现方式,供各位参考。

  • 原理
    先在 Tasker 中构建含传递数据的 JavaScript 模块内容,并写入文件中,接着 Autojs 读取该 JavaScript 模块文件,从而获得 Tasker 传递过来的数据。

  • 将数据输出至 JavaScript 模块文件

    1. 首先在 Autojs 脚本所在的文件夹中创建一个空文件,其名称可自定义,如 tk-parameters.js
    创建后的文件路径
      英文语言环境: /sdcard/Scripts/tk-parameters.js
      中文语言环境: /sdcard/脚本/tk-parameters.js
    
    1. 接着,在 Tasker 任务里将需要输出的数据组合为 JavaScript 对象,并把这模块形式的内容写入步骤 1 所创建的文件。
    // 写入文件的内容,其格式如下:
    module.exports={text:'string',num:20,arr:[],obj:{}};
    
  • Autojs 读取模块文件,获得数据
    Autojs 提供了一个简单的模块加载系统[2],通过加载含 Tasker 输出数据的模块文件,即可获得由 Tasker 传递的数据。

    // 加载方法
    const tkp = require('./tk-parameters');
    console.log(tkp.text); // 'string'
    console.log(tkp.num); // 20
    console.log(tkp.arr); // []
    console.log(tkp.obj); // {}
    

    注:关于 Autojs 模块的使用方法(与 Node.js 相似),请自行查看官方文档掌握。

  • 实例
    以获取 WiFi 信息为例,了解 Tasker 如何向 Autojs 传递数据。

    1. 数据输出
    2. 数据读取
    3. 运行
      WiFi 信息
  • 效果

    • Autojs 能获取正确的数据
    • 可接受的运行时间
    • 数据传递方便、直观以及可靠

Autojs 向 Tasker 传递数据

Tasker 也可以通过读取文件内容的方法获取 Autojs 传递的数据,只是这方法比起 Autojs 发送广播来说会稍显麻烦与复杂,因此接下来是介绍 Autojs 如何通过发送广播向 Tasker 传递数据。

  • 原理
    我们知道 Tasker 可以接收广播意图,因此只要 Autojs 发送带数据的广播意图,Tasker 便可接收它并且获得由 Autojs 传来的数据。

  • Autojs 发送广播
    构造一个含 extras 参数的意图,然后发送该广播意图。[3]

    // send-broadcast.js
    
    app.sendBroadcast({
      action: 'autojs.intent.action.MAIN',
      extras: {
        from: 'Autojs',
        version: '3.1.0 Beta',
        info: 'You got me :)',
      },
    });
    
    /**
    * 说明:
    * 1. action 的内容可以自定义,只要与 Tasker 接收意图中所写的 action 一致,Tasker 便可接收到该意图
    * 2. extras 是以键值对构成的对象,键值对亦可自定义
    */
    
  • Tasker 接收广播
    通过在配置文件(Profiles)中设置「接收意图」条件(其中 action 要与 Autojs 发送意图的 action 一致),然后在「进入任务」中可获得该意图的 extras 参数,以上面的广播为例,获得的参数值分别存储在局部变量 %from, %version, %info 中,可直接在进入任务中使用。(更多与 Tasker 接收意图相关的内容,请自行在用户指南中查看)

  • 实例
    以上面的意图内容作为例子,了解 Autojs 如何向 Tasker 传递数据。

    1. 发送广播
    2. 接收广播
    3. 运行
      接收来自 Autojs 的意图
  • 效果

    • Tasker 能获取正确的数据
    • 可立即接收意图
    • 数据传递方便、直观以及可靠

总结

个人以为,上面所提及的 Tasker 与 Autojs 的通信方法能很好地解决数据无法直接传递的问题,日后大家可尝试采取这些方法来实现需 Tasker 和 Autojs 协同完成的功能。最后,感谢众多酷安用户,我只是拾人牙慧,这文章的核心基本是来自您们所发表的评论(或回复)。

更新日志

  • 12/31/2018
    - 新增关于通过发送广播实现 Tasker 向 Autojs 传递数据的链接
  • 6/15/2018
    - 发布

其他

作者:sung
邮箱:[email protected]

参考资料


  1. 酷安评论 @随风荡 的回复 ↩

  2. Auto.js 文档 - 模块 ↩

  3. Auto.js 文档 - 进阶: 意图Intent ↩

你可能感兴趣的:(Tasker 与 Autojs 之间如何传递数据)