监听器
大约 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
Loading...