auto.waitFor();
events.observeNotification();
events.on('notification', function (n) {
log(
'收到新通知:\n 标题: %s, 内容: %s, \n包名: %s',
n.getTitle(),
n.getText(),
n.getPackageName()
);
});这段代码我脚本里面如果想要使用的话,我应该放在哪里单独创建一个function吗,还是放在脚本的开头就行,我尝试放在脚本开头,发现报错
回答
文档地址 https://docs.hamibot.com/
你提供的这段代码不需要单独创建一个 function 来包裹,但必须确保在正确的上下文中执行。常见的报错原因和正确使用方式如下:
✅ 正确放置位置
你应该将这段代码放在脚本的主流程中(即全局作用域),并且要保证以下几点:
-
auto.waitFor();必须先调用并成功执行
它会请求无障碍服务权限,并等待启用。如果无障碍未开启,脚本会一直等待。 -
事件监听代码应紧随
auto.waitFor()之后
不能在某个自定义函数内部异步调用events.observeNotification()后才开始监听,否则可能错过通知或因环境未准备好而报错。 -
脚本主体不能有阻塞操作在事件注册之前
比如死循环、长时间轮询等放在events.on(...)前面会导致事件无法注册。
✅ 推荐写法(直接放在脚本开头)
// 文档地址 https://docs.hamibot.com/
auto.waitFor();
// 开启通知监听
events.observeNotification();
// 注册通知事件回调
events.on('notification', function (n) {
log(
'收到新通知:\n 标题: %s, 内容: %s, \n包名: %s',
n.getTitle(),
n.getText(),
n.getPackageName()
);
});
// 保持脚本运行(关键!)
setInterval(() => {}, 1000);
⚠️ 关键点说明
-
必须加
setInterval(() => {}, 1000);
因为 Hamibot 脚本运行完主代码后会自动退出。如果你不保留一个持续运行的任务,脚本立即结束,事件监听也就失效了。这个空定时器的作用是让脚本持续运行。 -
不要把
events.on()放到异步回调里(除非你知道自己在做什么)
避免类似setTimeout(events.on(...), 1000)这种延迟注册,容易导致事件丢失。 -
确保手机已开启“通知使用权”
如果没开,events.observeNotification()会抛出异常并跳转设置页面。有时即使开了也要重新开关一次才能生效。
❌ 常见错误写法(会导致报错或无效)
// 错误1:没有 auto.waitFor()
events.observeNotification(); // 报错:无障碍服务未连接
// 错误2:注册事件后脚本退出
auto.waitFor();
events.observeNotification();
events.on('notification', ...);
// 脚本到这里就结束了,不会持续监听
// 错误3:被死循环卡住,事件无法处理
auto.waitFor();
while(true) {} // 事件队列被阻塞,on('notification') 永远不会触发
events.observeNotification();
events.on('notification', ...);
总结
你不需要把这段代码放进额外的 function,直接放在脚本开头,按顺序执行即可,只要加上 setInterval 保持运行,就不会报错。这是标准用法。