监听器

走着路睡觉大约 2 分钟

监听器

监听器根据作用域分为应用级(application-level)和项目级(project-level),可以监听通过消息总线发布的事件,
监听器必须是无状态的,不能有生命周期之类的操作

想了解都有哪些监听器,请查看 扩展点和监听器列表(Extension Point and Listener List ),列举了所有的 IntelliJ Platform的监听器,

在plugin.xml里注册的监听器性能要比在代码中注册性能更好,

  • 因为在plugin.xml里注册的监听器是懒加载的,只有第一次发送消息到消息总线或topic的时候,监听器才会加载,
  • 在代码中注册的监听器,会在应用启动的时候或打开项目的时候加载

提示

从 idea 2019.3版本后支持在plugin.xml里注册监听器

注册应用级(Application-Level)监听器

在plugin.xml里配置

<idea-plugin>
  <applicationListeners>
<!-- class 是实现了监听器接口的类      
    topic 指定了当前监听器想要监听的事件消息-->
    <listener
        class="myPlugin.MyListenerClass"
        topic="BaseListenerInterface"/>
  </applicationListeners>
</idea-plugin>

示例:

  • 如果你想监听 虚拟文件系统(Virtual File System) 中所有文件的变化,你需要实现 BulkFileListener 接口,监听 VirtualFileManager.VFS_CHANGES 主题,
    如果在代码内注册监听器,代码如下:
messageBus.connect().subscribe(VirtualFileManager.VFS_CHANGES,
    new BulkFileListener() {
        @Override
        public void after(@NotNull List<? extends VFileEvent> events) {
          // handle the events
        }
});
  • 在plugin.xml里注册监听器,配置如下:

监听器实现类:

package myPlugin;

public class MyVfsListener implements BulkFileListener {
  @Override
  public void after(@NotNull List<? extends VFileEvent> events) {
    // handle the events
  }
}

plugin.xml 配置:

<applicationListeners>
  <listener
      class="myPlugin.MyVfsListener"
      topic="com.intellij.openapi.vfs.newvfs.BulkFileListener"/>
</applicationListeners>

注册项目级(Project-Level)监听器

监听器实现类:

package myPlugin;

public class MyToolWindowListener implements ToolWindowManagerListener {
  private final Project project;
   //需要在构造器中定义Project 参数,当需要实例化的时候,会注入Project的实例
  public MyToolwindowListener(Project project) {
    this.project = project;
  }

  @Override
  public void stateChanged(@NotNull ToolWindowManager toolWindowManager) {
    // handle the state change
  }
}

plugin.xml 配置:

<idea-plugin>
    <projectListeners>
        <listener
                class="myPlugin.MyToolWindowListener"
                topic="com.intellij.openapi.wm.ex.ToolWindowManagerListener"/>
    </projectListeners>
</idea-plugin>

附加属性

监听器有一些附加属性

-os 如果配置了os="windows",该监听器将只在windows下生效

  • activeInTestMode 如果是在测试模式下(Application.isUnitTestMode()==true),activeInTestMode=false,该监听器失效

  • activeInHeadlessMode 如果是在测试模式下(Application.isHeadlessEnvironment()==true),activeInHeadlessMode=false,该监听器失效, 如果处于activeInHeadlessMode下,则必然是activeInTestMode

上次编辑于:
贡献者: zhaojingbo
Loading...