tasker 中文文档 下载 App

Tasker Java Code 动作详解 BeanShell 语法 Android API 调用 AI 辅助生成

Java Code vs JavaScriptlet

Java Code 是 Tasker 6.6 新增的脚本入口,与老牌 JavaScriptlet 的定位完全不同:

维度JavaScriptletJava Code
执行引擎Tasker 内置 JS 引擎BeanShell(类 Java 语法)
语言JavaScript(ECMAScript 5)类 Java 语法(宽松的 Java 5 风格)
Android API❌ 只能通过 tasker.*✅ 完整 Android API 访问
AI 助手❌✅ 内置 AI 代码生成/修改
RxJava❌✅ 支持
返回 Tasker 变量✅ tasker.returnValue()✅ 可以返回 Tasker 或 Java 变量
典型用途数据处理、变量操作系统 API 调用、Accessibility、UI 自动化

一句话选择:需要调用 Android 原生 API 时用 Java Code,其他场景(数据处理、变量操作)还是 JavaScriptlet 更顺手。

BeanShell 语法入门

Java Code 的执行环境是 BeanShell。它的语法比标准 Java 宽松很多——不需要写完整类结构、不需要分号、不需要声明变量类型。

和 Java 的主要差异

// 标准 Java
String name = "小明";
int count = 42;
System.out.println("Hello");

// BeanShell(Tasker Java Code 里)
name = "小明";           // 不需要类型声明
count = 42;
print("Hello");          // print() 是内置快捷方法

常用语法示例

// 变量(不需要声明类型)
battery = context.getSystemService(context.POWER_SERVICE);
level = battery.getIntProperty(battery.BATTERY_PROPERTY_CAPACITY);

// 字符串拼接
msg = "当前电量:" + level + " %";

// 条件
if (level < 20) {
    tasker.notify("低电量", msg);
} else {
    print("电量正常");
}

// 循环
for (i = 0; i < 10; i++) {
    print("第 " + i + " 次");
}

// 数组 / 集合
list = new ArrayList();
list.add("苹果");
list.add("橘子");
for (item : list) {
    print(item);
}

访问 Android API

这是 Java Code 最大的价值。你可以访问 Android Context 拿到任何系统服务。

获取 Context

// Tasker 自动注入 context 变量
print(context.getPackageName());  // 打印 "net.dinglisch.android.taskerm"

LocationManager 获取定位

locManager = context.getSystemService(context.LOCATION_SERVICE);

// 获取上次已知位置
lastLoc = locManager.getLastKnownLocation(locManager.GPS_PROVIDER);
if (lastLoc != null) {
    lat = lastLoc.getLatitude();
    lng = lastLoc.getLongitude();
    tasker.setGlobal("%Lat", lat.toString());
    tasker.setGlobal("%Lng", lng.toString());
}

发起 Intent 跳转

// 打开地图到指定坐标
intent = new android.content.Intent(android.content.Intent.ACTION_VIEW);
uri = android.net.Uri.parse("geo:39.9,116.4?q=39.9,116.4(北京)");
intent.setData(uri);
intent.addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

AlarmManager 设置闹钟

alarmManager = context.getSystemService(context.ALARM_SERVICE);

// 1 分钟后触发
calendar = java.util.Calendar.getInstance();
calendar.add(java.util.Calendar.MINUTE, 1);

intent = new android.content.Intent(context, YourReceiver.class);
pendingIntent = android.app.PendingIntent.getBroadcast(context, 0, intent, 0);

alarmManager.set(alarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

Accessibility Service(UI 自动化)

Tasker 6.6 可以通过 Java Code 获取 Accessibility Service 的引用:

// 获取 Accessibility Service
service = tasker.getAccessibilityService();

// 查找可点击节点
root = service.getRootInActiveWindow();
if (root != null) {
    nodes = root.findAccessibilityNodeInfosByText("确定");
    if (!nodes.isEmpty()) {
        node = nodes.get(0);
        node.performAction(android.accessibilityservice.AccessibilityNodeInfo.ACTION_CLICK);
    }
}

→ 可以实现"自动点击弹窗里的确定按钮"这类 UI 自动化场景。

AI 代码助手

Java Code 编辑器右上角有个放大镜图标,点击后打开 AI 助手面板:

内置 AI

外部 AI

AI 提示词示例

用户:帮我写一段 BeanShell 代码,获取当前连接的 Wi-Fi SSID,
     如果包含 "home" 就设置变量 %IsHome 为 1

AI 生成:
wifiManager = context.getSystemService(context.WIFI_SERVICE);
info = wifiManager.getConnectionInfo();
ssid = info.getSSID();  // 可能带引号:"MyHomeWiFi"

if (ssid != null && ssid.contains("home")) {
    tasker.setGlobal("%IsHome", "1");
} else {
    tasker.setGlobal("%IsHome", "0");
}

从 Tasker 返回值

Java Code 执行完后可以给 Tasker 主流程返回值:

// 返回一个 Tasker 变量值
tasker.returnValue(someResult);

// 或者设置多个 Tasker 变量
tasker.setGlobal("%Lat", lat.toString());
tasker.setGlobal("%Lng", lng.toString());
tasker.returnValue("ok");

RxJava2 异步支持

Tasker 6.6 的 Java Code 内置 RxJava2 支持,可以写异步操作:

import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;

Observable.fromCallable(() -> {
    // 在后台线程执行耗时操作
    Thread.sleep(1000);
    return "后台任务完成";
})
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.subscribe(result -> {
    tasker.notify("结果", result);
});

但注意——Tasker 的 Java Code 是阻塞执行的,这段代码里的 Rx 订阅虽然是非阻塞的,但 Tasker 会等整个脚本跑完才继续。如果只是简单的后台执行,用 Perform Task 或 Stop 后异步执行可能更合适。

安全注意