0%

IDEA平台的插件开发实战

由于一进入工作状态进长期久坐盯着电脑屏幕,长期以往始觉肩酸眼涩。所以想开发一个运行于IDE中的定时提醒插件,定时提醒自己离开座位远眺放松。

新建项目

Android Studio是基于IntelliJ IDEA构建的,因此要开发的也是基于IDEA平台的插件。插件的模板代码可以在IDEA上新建项目时勾选,也可以在官网上克隆使用:

  1. 在IDEA中创建一个新的插件项目:New Project -> Generators IDE Plugin -> Project Name -> Type choose Plugin not Theme
  2. 在官方仓库上克隆使用:IDEA platform plugin template
    官方文档中提到仓库中的模板代码预设了gradle配置支持,使用IDE因此本次实践是使用官方仓库上的模板代码。

开发插件

  1. 运行模板代码
    把官方模板仓库中的代码克隆下来,使用IDEA打开,无需额外设置其他配置,只需要等sync完成后选择run plugin的gradle选项即可运行。模板代码中预设的插件名是MyToolWindow,运行效果如图:

  2. 绘制控件
    本意是做一个定时提醒插件,分析需求后,只需要以下几个交互控件:

  • 设置提醒时间间隔
  • 确认提醒按钮
  • 取消提醒按钮
  • 提醒控件
    使用者可以设置提醒时间间隔,确认提交后定时提醒任务便开始运行,每隔指定时间会在IDE右下角进行弹窗提醒;用户可以通过取消提醒来取消提醒任务。
    IDEA插件是基于Swing使用Java/Kotlin进行开发的,所以可以使用Swing中的控件库来绘制UI。基于需求绘制及运行的结果如图所示:
  1. 持久化数据
    考虑到IDE可能会被关闭重启,不想每次都要手动输入一遍提醒数据,所以需要通过持久化把设置的阈值记录下来以便下次启动的时候还可以继续使用。IDEA官方提供了持久化的接口,开发者只需要实现并声明需要持久化字段的读与写就好。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    @State(name = "state", storages = [Storage(value = "state.xml")])  
    class PersistentState private constructor(): PersistentStateComponent<PersistentState> {

    companion object {
    fun getInstance(): PersistentState {
    return ApplicationManager.getApplication().getService(PersistentState::class.java)
    }
    }

    var remindIntervalTime: Int? = null


    override fun getState(): PersistentState? {
    return this
    }

    override fun loadState(p0: PersistentState) {
    XmlSerializerUtil.copyBean(p0, this)
    }
    }

    示例中实现了官方提供的PersistentStateComponent接口,里面指明了需要持久化数据的名词及类型,并且以单例的形式提供给调用者使用。

    1
    2
    写:persistentService.remindIntervalTime = value
    读:val value = PersistentState.getInstance().remindIntervalTime
  2. 发送通知
    IDEA中的弹窗种类有很多,提醒插件的需求是在IDE右下角出现提示弹窗,所以选择使用Notification。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    object RemindNotify {  
    fun showRemindNotify() {
    Notifications.Bus.notify(
    Notification(
    "Print",
    "Remind",
    "It's time to have a rest",
    NotificationType.WARNING
    )
    )
    }
    }
  3. 更新Icon
    最后,设置插件的Icon让插件更有辨识度。在root_project/src/main/resource/META-INF中新增pluginIcon.svg文件,运行打包时,会自动应用其为插件ICON。

打包插件

将插件打包成jar或zip文件,并发布到插件市场或其他适当的位置。打包后的文件存在于root_project/build/distributions文件夹下。本地使用方式是在IDE中进入插件配置页应用硬盘中的插件:Settings->Plugins->Manager->Install Plugin from disk->选择zip包->apply->重启IDE便能生效。

项目地址

https://github.com/Darrenyuen/Reminder-Plugin

参考

How to build a plugin for IDEA-based platform
https://zhuanlan.zhihu.com/p/608825921