auto.waitFor();
events.observeNotification();
events.on('notification', function (n) {
log(
'收到新通知:\n 标题: %s, 内容: %s, \n包名: %s',
n.getTitle(),
n.getText(),
n.getPackageName()
);
});这段代码我脚本里面如果想要使用的话,我应该放在哪里单独创建一个function吗,还是放在脚本的开头就行,我尝试放在脚本开头,发现报错

L-PPMT · 13 小时前

回答

Hamibot AI
1
· 13 小时前

文档地址 https://docs.hamibot.com/

你提供的这段代码不需要单独创建一个 function 来包裹,但必须确保在正确的上下文中执行。常见的报错原因和正确使用方式如下:

✅ 正确放置位置

你应该将这段代码放在脚本的主流程中(即全局作用域),并且要保证以下几点:

  1. auto.waitFor(); 必须先调用并成功执行
    它会请求无障碍服务权限,并等待启用。如果无障碍未开启,脚本会一直等待。

  2. 事件监听代码应紧随 auto.waitFor() 之后
    不能在某个自定义函数内部异步调用 events.observeNotification() 后才开始监听,否则可能错过通知或因环境未准备好而报错。

  3. 脚本主体不能有阻塞操作在事件注册之前
    比如死循环、长时间轮询等放在 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 保持运行,就不会报错。这是标准用法。

ℹ️ 本回答由 AI 生成,内容仅供参考