注:此方法适用于 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 中文用户指南的意图部分
实例
-
编写 Autojs 脚本
-
为脚本设置定时任务
-
Tasker 发送广播 Intent
-
运行
效果
比起通过构造 JavaScript 模块文件向 Autojs 传递数据的方法,本方法各方面都更优胜。旧方法是间接传递数据,本方法则是直接传递;而且,旧方法需要通过 Tasker 插件(或发送带有脚本文件路径数据的 Activity Intent)执行 Autojs 脚本,这比广播触发要慢。
更新日志
- 10/30/2018
- 发布
其他
作者:sung
邮箱:sdfsung@gmail.com
原创内容,转载请注明出处