Tasker 通过发送广播 Intent 向 Autojs 传递数据

注:此方法适用于 Autojs 4.0.3 Alpha4 及以上版本,其他版本可通过该方法实现

前言

如果曾看过这文章的读者,应该知道 Tasker 可以通过构造 JavaScript 模块文件向 Autojs 传递数据,虽然该方法很方便与灵活,但其终归依赖于文件的写入,间接地将数据传递给 Autojs。前几天,Auto.js 开发者 hyb1996 发布了 4.0.4Alpha6 版本,该版本新增了一个监听广播 Intent(意图)的触发条件,当中不仅内置了多个系统常见的广播 Intent,而且还允许用户自定义。读到这里,我想熟悉 Android Intent 的读者应该能敏锐地察觉到 Tasker 向 Autojs 传递数据的另一种方法了,没错,那就是 Tasker 向 Autojs 发送广播 Intent。接下来,我将给大家讲解该方法是如何实现的。

思路

首先编写好 Autojs 脚本,接着对其设置一个自定义的广播 Intent 定时任务,然后 Tasker 构造该 Intent(可含附加数据 extras)并发送出去。这样当 Autojs 接收到由 Tasker 发送过来的 Intent 时,便会执行相应的脚本(传递过来的附加数据可直接用于脚本)。

具体实现步骤

一、编写 Autojs 脚本

以下是接收到的广播 Intent 对象的基本使用方法:

/**
* 假设接收到的广播 Intent 内容如下:
*
* action: com.autojs.intent.INTENT_RECEIVED_DEMO
* data: package:net.dinglisch.android.taskerm
* package: org.autojs.autojs
* extras:
*   from:Tasker
*   message:Hello Autojs
*
* 说明:以上 intent 并非真实的格式,仅是为了令读者知道该 intent 有哪些值
*/

/**
* 由广播 Intent 触发的脚本都可通过以下方法获取到该广播的 Intent 对象
* 需注意,该对象为 Android 的 Intent 对象,需调用 Android 的 Intent 方法
*/
const intent = engines.myEngine().execArgv.intent;

const action = intent.action; // 读取 action;同 intent.getAction()
const data = intent.data; // 读取 data,返回 Java Uri 对象;同 intent.getData()
const package = intent.package; // 读取 package;同 intent.getPackage()
const from = intent.getStringExtra('from'); // 读取 extras 中的 from 值
const message = intent.getStringExtra('message'); // 读取 extras 中的 message 值

console.log(action); // "com.autojs.intent.USER_DEFINED"
console.log(data); // "package:net.dinglisch.android.taskerm"
console.log(package); // "org.autojs.autojs"
console.log(from); // "Tasker"
console.log(message); // "Hello Autojs"

// 遍历所有 extras 值(上面为单个 extra 的读取)
let o = {};
const extras = intent.extras;
if(extras) {
  let iter = extras.keySet().iterator();
  while(iter.hasNext()) {
    let key = iter.next();
    o[key] = extras.get(key);
  }
}
console.log(JSON.stringify(o)); // {"from":"Tasker","message":"Hello Autojs"}

// 其他实现代码
// ...

更多 Android Intent 的方法,请参阅 Intent#Public methods

二、在 Autojs 中自定义要触发的广播 Intent 定时任务(本步骤含有视频,请点击这里进行查看)

三、Tasker 发送广播 Intent

在 Tasker 内置的「发送意图」动作中构造含 extras 附加数据的广播,如下配置描述所示:

Send Intent [
  Action:
    com.autojs.intent.INTENT_RECEIVED_DEMO // 与上述二中自定义的广播 Action 相同
  Cat:
    None
  Mime Type:
  Data:
  Extra:
    from:Tasker // 附加数据:key="from", value="Tasker"
  Extra:
    message:Hello Autojs // 附加数据:key="message", value="Hello Autojs"
  Extra:
  Package:
    org.autojs.autojs // 能够接收此 Intent 的应用包名,若省略,则任何注册了该广播 Intent 的应用都可接收
  Class:
  Target:
    Broadcast Receiver // Intent 发送方式为 Broadcast,即广播
]

注:
Mime Type 与 Data 项一般不填写,
因为目前 Autojs 所允许自定义的广播 Intent 中的 Mime Type 与 Data 项都是省略的,
若填写了,则发送的广播与 Autojs 注册的广播会不匹配,即 Autojs 将无法接收到该广播 Intent

更多有关 Tasker 发送意图的内容,请参阅本人翻译的 Tasker 中文用户指南意图部分

实例

  1. 编写 Autojs 脚本

  2. 为脚本设置定时任务

  3. Tasker 发送广播 Intent

  4. 运行

效果

比起通过构造 JavaScript 模块文件向 Autojs 传递数据的方法,本方法各方面都更优胜。旧方法是间接传递数据,本方法则是直接传递;而且,旧方法需要通过 Tasker 插件(或发送带有脚本文件路径数据的 Activity Intent)执行 Autojs 脚本,这比广播触发要慢。

更新日志

  • 10/30/2018
    - 发布

其他

作者:sung
邮箱:sdfsung@gmail.com

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容