注:此方法適用于 Autojs 4.0.3 Alpha4 及以上版本概作,其他版本可通過(guò)該方法實(shí)現(xiàn)
前言
如果曾看過(guò)這文章的讀者溺蕉,應(yīng)該知道 Tasker 可以通過(guò)構(gòu)造 JavaScript 模塊文件向 Autojs 傳遞數(shù)據(jù),雖然該方法很方便與靈活,但其終歸依賴于文件的寫(xiě)入,間接地將數(shù)據(jù)傳遞給 Autojs僵腺。前幾天,Auto.js 開(kāi)發(fā)者 hyb1996 發(fā)布了 4.0.4Alpha6 版本壶栋,該版本新增了一個(gè)監(jiān)聽(tīng)廣播 Intent(意圖)的觸發(fā)條件辰如,當(dāng)中不僅內(nèi)置了多個(gè)系統(tǒng)常見(jiàn)的廣播 Intent,而且還允許用戶自定義贵试。讀到這里琉兜,我想熟悉 Android Intent 的讀者應(yīng)該能敏銳地察覺(jué)到 Tasker 向 Autojs 傳遞數(shù)據(jù)的另一種方法了,沒(méi)錯(cuò)毙玻,那就是 Tasker 向 Autojs 發(fā)送廣播 Intent豌蟋。接下來(lái),我將給大家講解該方法是如何實(shí)現(xiàn)的桑滩。
思路
首先編寫(xiě)好 Autojs 腳本梧疲,接著對(duì)其設(shè)置一個(gè)自定義的廣播 Intent 定時(shí)任務(wù),然后 Tasker 構(gòu)造該 Intent(可含附加數(shù)據(jù) extras)并發(fā)送出去施符。這樣當(dāng) Autojs 接收到由 Tasker 發(fā)送過(guò)來(lái)的 Intent 時(shí),便會(huì)執(zhí)行相應(yīng)的腳本(傳遞過(guò)來(lái)的附加數(shù)據(jù)可直接用于腳本)擂找。
具體實(shí)現(xiàn)步驟
一戳吝、編寫(xiě) Autojs 腳本
以下是接收到的廣播 Intent 對(duì)象的基本使用方法:
/**
* 假設(shè)接收到的廣播 Intent 內(nèi)容如下:
*
* action: com.autojs.intent.INTENT_RECEIVED_DEMO
* data: package:net.dinglisch.android.taskerm
* package: org.autojs.autojs
* extras:
* from:Tasker
* message:Hello Autojs
*
* 說(shuō)明:以上 intent 并非真實(shí)的格式,僅是為了令讀者知道該 intent 有哪些值
*/
/**
* 由廣播 Intent 觸發(fā)的腳本都可通過(guò)以下方法獲取到該廣播的 Intent 對(duì)象
* 需注意贯涎,該對(duì)象為 Android 的 Intent 對(duì)象听哭,需調(diào)用 Android 的 Intent 方法
*/
const intent = engines.myEngine().execArgv.intent;
const action = intent.action; // 讀取 action;同 intent.getAction()
const data = intent.data; // 讀取 data塘雳,返回 Java Uri 對(duì)象陆盘;同 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 值(上面為單個(gè) 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"}
// 其他實(shí)現(xiàn)代碼
// ...
更多 Android Intent 的方法隘马,請(qǐng)參閱 Intent#Public methods
二、在 Autojs 中自定義要觸發(fā)的廣播 Intent 定時(shí)任務(wù)(本步驟含有視頻妻顶,請(qǐng)點(diǎn)擊這里進(jìn)行查看)
三酸员、Tasker 發(fā)送廣播 Intent
在 Tasker 內(nèi)置的「發(fā)送意圖」動(dòng)作中構(gòu)造含 extras 附加數(shù)據(jù)的廣播,如下配置描述所示:
Send Intent [
Action:
com.autojs.intent.INTENT_RECEIVED_DEMO // 與上述二中自定義的廣播 Action 相同
Cat:
None
Mime Type:
Data:
Extra:
from:Tasker // 附加數(shù)據(jù):key="from", value="Tasker"
Extra:
message:Hello Autojs // 附加數(shù)據(jù):key="message", value="Hello Autojs"
Extra:
Package:
org.autojs.autojs // 能夠接收此 Intent 的應(yīng)用包名讳嘱,若省略幔嗦,則任何注冊(cè)了該廣播 Intent 的應(yīng)用都可接收
Class:
Target:
Broadcast Receiver // Intent 發(fā)送方式為 Broadcast,即廣播
]
注:
Mime Type 與 Data 項(xiàng)一般不填寫(xiě)沥潭,
因?yàn)槟壳?Autojs 所允許自定義的廣播 Intent 中的 Mime Type 與 Data 項(xiàng)都是省略的邀泉,
若填寫(xiě)了,則發(fā)送的廣播與 Autojs 注冊(cè)的廣播會(huì)不匹配,即 Autojs 將無(wú)法接收到該廣播 Intent
更多有關(guān) Tasker 發(fā)送意圖的內(nèi)容汇恤,請(qǐng)參閱本人翻譯的 Tasker 中文用戶指南的意圖部分
實(shí)例
-
編寫(xiě) Autojs 腳本
-
為腳本設(shè)置定時(shí)任務(wù)
-
Tasker 發(fā)送廣播 Intent
-
運(yùn)行
效果
比起通過(guò)構(gòu)造 JavaScript 模塊文件向 Autojs 傳遞數(shù)據(jù)的方法庞钢,本方法各方面都更優(yōu)勝。舊方法是間接傳遞數(shù)據(jù)屁置,本方法則是直接傳遞焊夸;而且,舊方法需要通過(guò) Tasker 插件(或發(fā)送帶有腳本文件路徑數(shù)據(jù)的 Activity Intent)執(zhí)行 Autojs 腳本蓝角,這比廣播觸發(fā)要慢阱穗。
更新日志
- 10/30/2018
- 發(fā)布
其他
作者:sung
郵箱:sdfsung@gmail.com
原創(chuàng)內(nèi)容,轉(zhuǎn)載請(qǐng)注明出處