thanox灭霸自动任务小脚本案例
doc
情景模式语法
- 情景模式语法估计是java
- 在
condition
和actions
对应的值就是java代码 - 但是由于情景模式内容要求是json(或者yaml)的形式,
- java代码需要先处理成字符串,然后交给thanox解析
- 有thanox请求虚拟机代为执行
thanox 自带示例
- 除了参考文档,从thanox app 中可以导入在线案例,可以进一步了解情景模式写法
延迟执行的方法和案例
delay
- 可以使用
delay
字段控制延迟(by thanox)
息屏2秒后自动关闭NFC
| [ |
| { |
| "name": " off NFC", |
| "description": "turn NFC off after screenoff(锁屏2s后关闭NFC)", |
| "priority": 1, |
| "delay": 2000, |
| "condition": "screenOff&&hw.isNfcEnabled()", |
| "actions": [ |
| "ui.showShortToast('关闭NFC')+hw.disableNfc()" |
| ] |
| } |
| ] |
| |
Thread.sleep
- 也可以使用
Thread.sleep()
控制延迟执行(by java)
解锁亮屏自动开启NFC
| [ |
| { |
| "name": " flash NFC", |
| "description": "turn NFC on temporarily after screenOn(NFC)", |
| "priority": 1, |
| "delay": 1, |
| "condition": "screenOn==true&&!hw.isNfcEnabled()", |
| "actions": [ |
| "ui.showShortToast('🎈开启NFC,保持3s后关闭')", |
| "hw.enableNfc();", |
| "ui.showShortToast(\"🎢关闭NFC\")", |
| "Thread.sleep(3000)", |
| "hw.disableNfc()" |
| ] |
| } |
| ] |
利用java API来编写自动化任务
时间段(时间区间)执行任务(情景模式)
| [ |
| { |
| "name": "设定时间段,在指定时间段执行任务(亮屏/息屏5g为例)", |
| "description": "采用一天24时记法;本例子中,在早上5:10分~22:40内,亮屏开启5g,息屏关闭5g(变成4g)其余时间,不作妖;可以自行设定延时执行delay字段(单位是毫秒,也就是说1分钟要设置成60*1000=60000秒),或者讲代码中的时间点改成你想要的;如果需要秒级精确度,可以照样子添加条件链 您可在代码中找到start_hour,start_minute,end_hour,end_minute变量(默认值分别为5,10,22,40,将这几个值修改为你需要的时间段,分别代表开始时间的小时,分钟;结束时间的小时,分钟)", |
| "priority": 2, |
| "delay": 500, |
| "condition": "if(screenOn||screenOff){import java.util.Date;Date date=new Date();int hour=date.getHours(),minute=date.getMinutes(),second=date.getSeconds();int start_hour=5,start_minute=10,end_hour=22,end_minute=40,start_minute_of_day=start_hour*60+start_minute*1,end_minute_of_day=(end_hour)*60+(end_minute)*1,now_minute_of_day=hour*60+minute;ui.showShortToast(\"🎈now_time:\"+hour+\":\"+minute+\":\"+second);if(start_minute_of_day<=now_minute_of_day&&now_minute_of_day<=end_minute_of_day){ui.showShortToast('🎉当前时刻处于情景有效期,执行任务:'+'...');ui.showShortToast('🎁调试信息:任务有效时间[分钟化统计]:'+start_minute_of_day+' ~ '+end_minute_of_day+' 👓now:'+now_minute_of_day);if(screenOn){su.exe('service call miui.radio.extphone 28 i32 1 i32 0');ui.showShortToast('亮屏,5g打开')} else if(screenOff){su.exe('service call miui.radio.extphone 28 i32 0 i32 0');ui.showShortToast('息屏,关闭5g'))};}}", |
| "actions": [ |
| "" |
| ] |
| } |
| ] |
| |
-
下面是一个逻辑判断错误的版本:
if( hour>=start_hour&&hour<=end_hour&&minute>=start_minute&&minute<=end_minute){......}
时间段内让NFC快捷方式有效
| [ |
| { |
| "name": "NFC快捷开关:在指定时段内让NFC桌面快捷方式启动有效),关闭则总是有效的", |
| "description": "采用一天24时记法;本例子中,在早上5:10分~22:40内,亮屏开启5g,息屏关闭5g(变成4g)其余时间,不作妖;可以自行设定延时执行delay字段(单位是毫秒,也就是说1分钟要设置成60*1000=60000秒),或者讲代码中的时间点改成你想要的;如果需要秒级精确度,可以照样子添加条件链 您可在代码中找到start_hour,start_minute,end_hour,end_minute变量(默认值分别为5,10,7,40,将这几个值修改为你需要的时间段,分别代表开始时间的小时,分钟;结束时间的小时,分钟);振动效果可能需要打开系统震动反馈,比如MIUI,chaptic feedback,才可以成功振动", |
| "priority": 2, |
| "delay": 100, |
| "condition": " if(shortcutLaunched == true && shortcutValue == 'NFC'&& hw.isNfcEnabled() == false){import java.util.Date;Date date=new Date();int hour=date.getHours(),minute=date.getMinutes(),second=date.getSeconds();int start_hour=5,start_minute=10,end_hour=7,end_minute=40,start_minute_of_day=start_hour*60+start_minute*1,end_minute_of_day=(end_hour)*60+(end_minute)*1,now_minute_of_day=hour*60+minute;ui.showShortToast(\"now_time:\"+hour+\":\"+minute+\":\"+second);if(start_minute_of_day<=now_minute_of_day&&now_minute_of_day<=end_minute_of_day){ui.showShortToast('当前时刻处于情景有效期,执行任务:'+'...');ui.showShortToast('调试信息:任务有效时间[分钟化统计]:'+start_minute_of_day+' ~ '+end_minute_of_day+' now:'+now_minute_of_day)};ui.showShortToast('打开NFC') + hw.enableNfc()+ringtone.wengwengweng(1)}else if (shortcutLaunched == true && shortcutValue == 'NFC'&& hw.isNfcEnabled() == true) {(ui.showShortToast('关闭NFC🧔')+hw.disableNfc()+ringtone.dingdingding(1))} ", |
| "actions": [ |
| "" |
| ] |
| } |
| ] |
桌面快捷方式创建(行为触发器)
NFC桌面开关
-
旧版本
-
| [ |
| { |
| "name": "nfc", |
| "description": "nfc", |
| "priority": 2, |
| "condition": "if(shortcutLaunched == true && shortcutValue == 'NFC'&& hw.isNfcEnabled() == false){(ui.showShortToast('打开NFC✔️✅') + hw.enableNfc()+ringtone.dingdingding(2))}else if (shortcutLaunched == true && shortcutValue == 'NFC'&& hw.isNfcEnabled() == true) {(ui.showShortToast('关闭NFC🧔👲')+hw.disableNfc()+ringtone.dingdingding(1))}", |
| "actions": [ |
| "" |
| ] |
| } |
| ] |
-
桌面快捷方式需要创建快捷方式,通过value来对应情景模式
-
给与thanox必要的创建桌面快捷方式才行
采用adb 命令方式执行NFC开关控制
- 您可以使用
anywhere
这个app 方便地创建adb 命令的开关
- 并且开关是带有状态的
- 事实上,NFC可以通过
svc
命令开控制:
svc nfc enable
svc nfc disable
息屏关闭NFC
| [ |
| { |
| "name": "sn", |
| "description": "turn off nfc at once if the screenOff", |
| "priority": 1, |
| "condition": "screenOff==true", |
| "actions": [ |
| "if(hw.isNfcEnabled()==true){ringtone.dingdingding()+ui.showShortToast('Nfc was on before screenOff🎅,try to turn off nfc!🛑')+hw.disableNfc()}", |
| "" |
| ] |
| } |
| ] |
执行脚本
自动化网络切换
sh.exe()/su.exe()使用案例:5G/4G网络自动切换
- 根据某个应用(这里以com.zfsoft.newzjgs为例)的启动(切入和杀死来开启或者关闭5g网络(到4g)
| [ |
| { |
| "name": "s5gzjgsu", |
| "description": "根据某个应用(这里以com.zfsoft.newzjgs为例)的启动(切入和杀死来开启或者关闭5g网络(到4g)", |
| "priority": 1, |
| "condition": "if (frontPkgChanged == true && to == 'com.zfsoft.newzjgs'){su.exe('service call miui.radio.extphone 28 i32 1 i32 0')} else if(taskRemoved==true && pkgName=='com.zfsoft.newzjgs'){su.exe('service call miui.radio.extphone 28 i32 0 i32 0')})", |
| "actions": [ |
| "" |
| |
| ] |
| } |
| ] |
进入应用商店后自动切换5g
| [ |
| { |
| "name": "5g appMarket", |
| "description": "打开应用商店后开启5g网络,杀掉应用商店是将网络切换为4g,适合于平常不用5g,但是流量充足的用户", |
| "priority": 1, |
| "condition": "if (frontPkgChanged == true && to == 'com.xiaomi.market'){su.exe('service call miui.radio.extphone 28 i32 1 i32 0');ui.showShortToast('5g打开')} else if(taskRemoved == true && pkgName == 'com.xiaomi.market'){su.exe('service call miui.radio.extphone 28 i32 0 i32 0');ui.showShortToast('关闭5g'))};", |
| "actions": [ |
| "" |
| ] |
| } |
| ] |
| |
集合化(全局变量自动5g切换)
| [ |
| { |
| "name": "smart 5g for MIUI13", |
| "description": "需要创建叫smart5gApps的全局变量!(往里面添加需要启动后需要自动5g允许) 默认情况下,如果划掉后台相应APP后台,会被认为不再需要5g,变成4g。 为了不影响下载型APP使用,建立另一个全局变量keepLocation,用来指定豁免清单(可将应用商店加入其中),(使用thanox的pick来添加APP包名到环境变量里比较方便.)", |
| "priority": 1, |
| "delay": 0, |
| "condition": " if(frontPkgChanged&&globalVarOf$smart5gApps.contains(to)){ui.showShortToast(\"即将开启5g,for\"+to);su.exe('service call miui.radio.extphone 28 i32 1 i32 0');} if(taskRemoved == true && globalVarOf$smart5gApps.contains(pkgName) ){foreach(app:globalVarOf$keep5g){if(task.hasTaskFromPackage(app)){ui.showShortToast(\"5g下载型APP在运行,不关闭5g\");break}}ui.showShortToast(\"即将关闭5g,by\"+pkgName);su.exe('service call miui.radio.extphone 28 i32 0 i32 0');}}", |
| "actions": [ |
| "" |
| ] |
| } |
| ] |
| |
自动打开定位
错误(失败案例)
| [ |
| { |
| "name": "为打卡签到类APP自动启动定位", |
| "description": "息屏时立即杀死全局变量中的进程名(需要创建叫locationapps的全局变量,并且讲需要自动打开定位的APP加入(pick到里面)", |
| "priority": 1, |
| "delay": 0, |
| "condition": "if (frontPkgChanged==true){foreach(locApp:globalVarOf$locationApps){if(to==locApp){ui.showShortToast(\"即将开启定位,for\"+locApp);hw.enableLocation();}else if(taskRemoved == true && pkgName == locApp){ui.showShortToast(\"即将关闭定位,by\"+locApp);hw.disableLocation();}}}", |
| "actions": [ |
| "" |
| ] |
| } |
| ] |
- su.exe()是以root权限运行的,所以不像sh.exe()那样容易遇到权限不足而无法运行
- 这里包名的获取方案有多种,比如三方app
- thanox自带开发者工具可以
- android开发者电量性能检查也相关功能
- MT管理器
- 爱玩机等
遍历(powered by java)
锁屏杀死不必要后台(nokeep)
| [ |
| { |
| "name": "nokeep", |
| "description": "nokeep", |
| "priority": 1, |
| "condition": "screenOff==true", |
| "actions": [ |
| "foreach(tsk:globalVarOf$nokeep){killer.killPackage(tsk)}", |
| "ui.showShortToast('kill nokeep apps')" |
| ] |
| } |
| ] |
全局变量
创建全局变量
- 上面的锁屏杀后台需要创建一个全局变量,名为nokeep
- 创建的时候,可以直接
pick app
,选择需要锁屏杀死的app(包名) - 也可以在进程管理哪里单击,然后选择加入到指定的全局变量中
充电时保证scene在后台运行
- 如果scene没有运行,则拉起充电统计的activity
| [ |
| { |
| "name": "chg", |
| "description": "chg", |
| "priority": 1, |
| "condition": "battery.getBatteryState().isCharging &&!task.hasTaskFromPackage('com.omarea.vtools')", |
| "actions": [ |
| "ui.showShortToast('scene not actived')", |
| "su.exe('am start -n com.omarea.vtools/com.omarea.vtools.activities.ActivityCharge')", |
| "ui.showLongToast('try to active scene done ')" |
| ] |
| } |
| ] |
| |
thanox常驻后台
- 上述网络切换中用到后台切换的监视:frontPkgChanged,这需要thanox保持后台活跃,否则无法捕获到相关信号导致无法执行自动任务
利用thaox 保持指定应用集合后台活跃(keepActive)
- 本功能不同于后台保活,但是可以在app被杀掉后立刻重启(比如通讯软件,以免遗漏消息接受)
| [ |
| { |
| "name": "keepbg(AutoArousePackage保持进程活跃v1", |
| "description": "keepbg;保持指定应用活跃在后台😂😂😂主要是聊天通讯软件以及一些需要常驻后台的进程😂task.hasTaskFromPackage('com.tencent.mm')==false不靠谱 注意,只有开机手动启动过一次的软件才可以后续的活跃保持,否则无法保持活跃 👿👿需要创建环境变量Keepbg,将需要活跃的APP包名pick到里面,作为需要保持活跃的清单", |
| "priority": 1, |
| "condition": "pkgKilled == true &&globalVarOf$keepbg.contains(pkgName)", |
| "actions": [ |
| "//ui.showShortToast('😱😣<'+pkgName+' >was killed,try to arouse it 🍅₍˄·͈༝·͈˄*₎◞ ̑̑')", |
| "activity.launchProcessForPackage(pkgName)", |
| "/*Thread.sleep(1000)*/", |
| "//ui.showShortToast('try to active< '+pkgName+'>done 🍔=͟͟͞͞=͟͟͞͞(●⁰ꈊ⁰● ')", |
| "return" |
| ] |
| } |
| ] |
miui自带的自动任务
- 2022年的miui手机管家已经支持比较基础的自动任务,也可以完成nfc/导航的条件触发,但是还不如thanox的情景触发强大
- 但是胜在方便(名牌专用软件)/thanox是android通用的(却有root风险)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2021-10-06 js_setTimeout和js单线程任务队列以及let/var声明的循环变量的作用现象推测(中断和异步)/windows(macos)鼠标指针的圈圈是个啥