首页 > 解决方案 > 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,以防万一。

标签: javaxml

解决方案


推荐阅读