java - Java中的D-Bus信号OnBatteryChanged处理程序未接收到信号
问题描述
我用 Java 编写了一个代码,它应该处理信号 D-Bus freedesktop.PowerManagement.OnBatteryChanged。但是当我拔下充电器时,什么也没有发生。代码片段如下。
public class DBusDemo {
public static void main(String[] args) throws DBusException {
conn = DBusConnection.getConnection(DBusConnection.DBusBusType.SESSION);
conn.addSigHandler(PowerManagement.OnBatteryChanged.class, new _sighandler());
}
private static class _sighandler implements DBusSigHandler<PowerManagement.OnBatteryChanged> {
@Override
public void handle(PowerManagement.OnBatteryChanged onBatteryChanged) {
System.out.println("on battery");
}
}
}
Introspectable.Introspect 输出的相关部分:
<interface name="org.freedesktop.PowerManagement">
<method name="Shutdown"/>
<method name="Reboot"/>
<method name="Hibernate"/>
<method name="Suspend"/>
<method name="CanShutdown">
<arg type="b" name="can_shutdown" direction="out"/>
</method>
<method name="CanReboot">
<arg type="b" name="can_reboot" direction="out"/>
</method>
<method name="CanSuspend">
<arg type="b" name="can_suspend" direction="out"/>
</method>
<method name="CanHibernate">
<arg type="b" name="can_hibernate" direction="out"/>
</method>
<method name="GetOnBattery">
<arg type="b" name="on_battery" direction="out"/>
</method>
<method name="GetLowBattery">
<arg type="b" name="low_battery" direction="out"/>
</method>
<signal name="OnBatteryChanged">
<arg type="b" name="on_battery"/>
</signal>
<signal name="LowBatteryChanged">
<arg type="b" name="low_battery"/>
</signal>
</interface>
根据此输出的接口:
package org.freedesktop;
import org.freedesktop.dbus.exceptions.DBusException;
import org.freedesktop.dbus.interfaces.DBusInterface;
import org.freedesktop.dbus.messages.DBusSignal;
public interface PowerManagement extends DBusInterface {
public void Shutdown();
public void Reboot();
public void Hibernate();
public void Suspend();
public boolean CanShutdown();
public boolean CanReboot();
public boolean CanSuspend();
public boolean CanHibernate();
public boolean GetOnBattery();
public boolean GetLowBattery();
public class OnBatteryChanged extends DBusSignal {
public final boolean on_battery;
public OnBatteryChanged(String objectpath, boolean on_battery) throws DBusException {
super(objectpath, on_battery);
this.on_battery = on_battery;
}
}
public class LowBatteryChanged extends DBusSignal {
public final boolean low_battery;
public LowBatteryChanged(String objectpath, boolean low_battery) throws DBusException {
super(objectpath, low_battery);
this.low_battery = low_battery;
}
}
}
当我获得远程对象 PowerManagement 并调用 GetOnBattery() 方法时,当我拔下充电器时,函数返回 true,在插入充电器时返回 false。所以 PowerManagement 对象似乎按预期工作。但我的对象从未收到信号 OnBatteryChanged。
我做错了什么?每个提示将不胜感激!
PS:我使用的是 xubuntu 20.04,以防万一。
解决方案
推荐阅读
- google-apps-script - 使用 Google Apps 脚本的 DocumentApp 库的 listItems 的 getListId() 不能识别文档中的连贯列表?
- redirect - 将 Shopify 主页重定向到密码页面
- javascript - 使用 python 重新创建 CryptoJS Hmac
- r - 突出显示 ggplot 堆叠条形图的部分
- git - `git stash push` 存储了什么?
- javascript - 有没有办法使用 WebStorm 中的调试器单步执行 RunJS 应用程序
- postgresql - 使用休眠的动态查询
- c# - 带有字节流的 Google 文档查看器
- shell - zabbix_get 和 AWK/substr - ZBX_NOTSUPPORTED:参数太多
- ios - 平板电脑;即使是 Master/Detail Layout 的示例项目也不会调用 collapseSecondary secondaryViewController