首页
/ ab-download-manager扩展开发指南:创建自定义下载完成后处理插件

ab-download-manager扩展开发指南:创建自定义下载完成后处理插件

2026-02-05 04:44:10作者:乔或婵

概述

在日常使用下载管理器时,您是否经常需要在文件下载完成后执行额外操作?比如自动解压压缩包、发送通知到消息应用或进行病毒扫描?ab-download-manager提供了灵活的扩展机制,允许您通过编写自定义插件来实现这些功能。本文将指导您创建一个下载完成后自动打开文件的处理插件,全程无需深入了解复杂的核心代码。

开发环境准备

必要工具

获取源码

git clone https://gitcode.com/gh_mirrors/ab/ab-download-manager.git
cd ab-download-manager

项目结构中与插件开发相关的核心目录:

插件开发基础

事件驱动架构

ab-download-manager采用事件驱动架构,所有下载相关事件都会通过DownloadManager类中的listOfJobsEvents流发布。关键事件包括:

  • OnJobAdded - 新下载任务添加时触发
  • OnJobStarted - 下载开始时触发
  • OnJobCompleted - 下载完成时触发(我们插件将关注此事件)

下载事件流程

插件工作原理

自定义插件通过订阅OnJobCompleted事件来实现下载完成后的处理逻辑。项目中的InstallerPlugin展示了插件的基本结构,其核心是实现Plugin接口并注册任务:

class FileOpenerPlugin : Plugin<Project> {
    override fun apply(target: Project) {
        // 插件初始化逻辑
        val downloadManager = target.extensions.getByType(DownloadManager::class.java)
        
        // 订阅下载完成事件
        downloadManager.listOfJobsEvents.onEach { event ->
            if (event is DownloadManagerEvents.OnJobCompleted) {
                handleDownloadCompleted(event.downloadItem)
            }
        }.launchIn(target.coroutineScope)
    }
    
    private fun handleDownloadCompleted(downloadItem: DownloadItem) {
        // 自定义处理逻辑
        val file = File(downloadItem.folder, downloadItem.name)
        Desktop.getDesktop().open(file) // 打开下载文件
    }
}

实战:创建自动打开文件插件

1. 创建插件项目结构

compositeBuilds/plugins/目录下创建新插件目录:

mkdir -p compositeBuilds/plugins/file-opener-plugin/src/main/kotlin/ir/amirab/fileopener/

2. 实现插件主类

创建FileOpenerPlugin.kt文件: compositeBuilds/plugins/file-opener-plugin/src/main/kotlin/ir/amirab/fileopener/FileOpenerPlugin.kt

package ir.amirab.fileopener

import ir.amirab.downloader.DownloadItem
import ir.amirab.downloader.DownloadManagerEvents
import org.gradle.api.Plugin
import org.gradle.api.Project
import java.awt.Desktop
import java.io.File

class FileOpenerPlugin : Plugin<Project> {
    override fun apply(target: Project) {
        // 获取DownloadManager实例
        val downloadManager = target.extensions.getByType(DownloadManager::class.java)
        
        // 订阅下载完成事件
        downloadManager.listOfJobsEvents.onEach { event ->
            if (event is DownloadManagerEvents.OnJobCompleted) {
                val downloadItem = event.downloadItem
                try {
                    val file = File(downloadItem.folder, downloadItem.name)
                    if (file.exists() && Desktop.isDesktopSupported()) {
                        Desktop.getDesktop().open(file)
                        target.logger.lifecycle("自动打开文件: ${file.absolutePath}")
                    }
                } catch (e: Exception) {
                    target.logger.error("打开文件失败: ${e.message}", e)
                }
            }
        }.launchIn(target.coroutineScope)
    }
}

3. 配置插件元数据

创建插件描述文件resources/META-INF/gradle-plugins/ir.amirab.fileopener.properties

implementation-class=ir.amirab.fileopener.FileOpenerPlugin

4. 注册插件

在项目根目录的settings.gradle.kts中添加插件引用:

pluginManagement {
    includeBuild("compositeBuilds/plugins/file-opener-plugin")
}

调试与测试

本地测试插件

  1. 在IntelliJ IDEA中打开项目
  2. 将插件模块添加到桌面应用依赖
  3. 运行desktop:app:run配置启动应用
  4. 添加测试下载任务,观察文件是否在完成后自动打开

下载测试界面

调试技巧

  • handleDownloadCompleted方法中设置断点
  • 通过downloadItem对象检查下载元数据:
    • downloadItem.link - 原始下载URL
    • downloadItem.size - 文件大小(字节)
    • downloadItem.completeTime - 完成时间戳

高级功能实现

文件类型过滤

扩展插件以仅处理特定类型的文件:

// 支持的文件类型列表
private val SUPPORTED_EXTENSIONS = setOf("pdf", "txt", "jpg", "png", "docx")

private fun handleDownloadCompleted(downloadItem: DownloadItem) {
    val file = File(downloadItem.folder, downloadItem.name)
    val extension = file.extension.lowercase()
    
    if (SUPPORTED_EXTENSIONS.contains(extension)) {
        // 仅处理支持的文件类型
        Desktop.getDesktop().open(file)
    }
}

用户配置界面

通过添加配置界面让用户自定义插件行为:

  1. 创建设置面板UI 参考
  2. 使用Config.kt存储用户偏好
  3. 在插件中读取配置决定是否自动打开文件

插件打包与分发

构建插件

./gradlew compositeBuilds/plugins/file-opener-plugin:build

构建产物将生成在:compositeBuilds/plugins/file-opener-plugin/build/libs/目录下

安装自定义插件

  1. 将生成的JAR文件复制到应用插件目录:
    • Windows: %APPDATA%\ab-download-manager\plugins\
    • Linux: ~/.config/ab-download-manager/plugins/
  2. 重启ab-download-manager应用

总结与扩展方向

通过本文学习,您已掌握:

  • ab-download-manager事件系统的使用方法
  • 自定义下载完成处理插件的开发流程
  • 插件调试与打包分发技巧

官方文档:README.md
社区支持:Telegram Group

扩展思路

  • 云同步插件 - 下载完成后自动上传到Google Drive/OneDrive
  • 文件转换插件 - 将下载的图片自动转换为WebP格式
  • 通知插件 - 发送下载完成消息到Slack/Teams

希望本指南能帮助您构建强大的自定义插件,提升ab-download-manager的使用体验!如有任何问题,欢迎在项目Issues中提问。

登录后查看全文
热门项目推荐
相关项目推荐