- 业务流程管理层面: 指的是像 Activiti、Flowable 这样的开源工作流引擎,它们使用 BPMN 2.0 标准来定义业务流程,其中的核心概念之一就是 “活动”。
- Android 开发层面: 指的是 Android 系统提供的
Activity类,它是 App 开发中用于构建用户界面的基本组件。
由于您的问题是在一个通用的 Java 技术背景下,我会重点讲解 第一层面(工作流引擎中的 Activity),并简要说明第二层面(Android Activity)以作区分。

核心概念:工作流引擎中的 Activity
在像 Activiti 或 Flowable 这样的工作流引擎中,Activity 是工作流定义中的一个核心术语,它代表了流程中的一个“步骤”或“任务”,描述了流程在某个节点上需要执行的操作。
在 BPMN 2.0 规范中,Activity 是一个总称,它主要分为以下几种类型:
任务
这是最常见、最核心的 Activity,它代表流程中需要执行的一项具体工作,任务又可以细分为多种类型:
-
用户任务:
(图片来源网络,侵删)- 描述: 需要由人工参与者完成的任务。“审批请假申请”、“处理客户投诉”。
- 实现: 在 Java 中,通常意味着你需要将任务信息(如任务 ID、处理人、表单数据等)持久化到数据库中,然后通过一个服务(如 TaskService)将任务推送给指定的用户或用户组,用户通过一个前端界面来领取、处理或完成任务。
- 示例:
// 流程定义文件 (BPMN) 中定义 <userTask id="approveTask" name="审批申请" />
- Java 代码中,你可以查询并分配这个任务:
// 查找当前待办任务 Task task = taskService.createTaskQuery().taskName("审批申请").singleResult(); if (task != null) { // 将任务分配给张三 taskService.claim(task.getId(), "zhangsan"); // 张三处理任务(批准) taskService.complete(task.getId()); }
- Java 代码中,你可以查询并分配这个任务:
-
服务任务:
- 描述: 由自动化的后台服务(Java 代码)执行的任务,它不涉及人工交互。“发送邮件”、“调用外部 API”、“计算订单总额”。
- 实现: 你需要实现一个 Java 类(通常实现
JavaDelegate接口或使用@Delegate注解),并在 BPMN 流程中指定这个类,当流程执行到这个服务任务时,引擎会自动调用你编写的 Java 代码。 - 示例:
// Java 代码 public class SendEmailService implements JavaDelegate { @Override public void execute(DelegateExecution execution) { String to = (String) execution.getVariable("applicantEmail"); String content = "您的申请已提交,请等待审批。"; // 调用邮件服务发送邮件... System.out.println("邮件已发送至: " + to); } }- BPMN 流程定义中引用:
<serviceTask id="sendEmailTask" name="发送邮件" activiti:class="com.your.package.SendEmailService" />
- BPMN 流程定义中引用:
-
脚本任务:
- 描述: 在任务节点内执行一段脚本(如 JavaScript、Groovy),适合简单的逻辑处理。
- 实现: 在 BPMN 中直接编写脚本代码。
-
其他任务类型: 还有接收任务(等待外部信号)、业务规则任务(调用规则引擎如 Drools)等。
子流程
- 描述: 将一个复杂的流程封装成一个独立的、可复用的流程单元,然后嵌入到主流程中,这类似于编程语言中的“方法”或“函数”。
- 实现: 你可以定义一个独立的 BPMN 文件作为子流程,然后在主流程中通过一个“调用活动”节点来调用它,这极大地提高了流程的模块化和复用性。
事件网关
- 描述: 一种特殊的 Activity,它本身不执行任务,而是根据流程变量的值,将流程分支到不同的路径上,它像一个开关,根据条件选择一个出口继续执行。
主流 Java 工作流引擎推荐
当你提到“Java 工作流”时,通常指的就是使用以下这类引擎来管理业务流程。

Activiti
- 简介: 由 Tom Baeyens(jBPM 的创始人之一)创建,是当前最流行、社区最活跃的开源工作流引擎,它现在是 Alfresco 的一部分。
- 特点:
- 轻量级: 易于集成到 Spring Boot 等现代 Java 项目中。
- 功能强大: 完全支持 BPMN 2.0,包括流程图、表单、规则集成等。
- Spring Boot 集成: 提供了非常方便的
starter,几行代码就能完成集成。 - 活跃的社区: 文档、教程和社区支持非常丰富。
- 适用场景: 几乎所有需要业务流程管理的 Java Web 应用,尤其是需要快速开发和迭代的场景。
Flowable
- 简介: 2025 年由 Activiti 的核心团队创建,可以说是 Activiti 的一个“分支”或“竞争者”,由于创始团队的原因,它在设计理念上与 Activiti 非常相似,但有一些改进和独立的发展。
- 特点:
- 与 Activiti 高度兼容: 如果你熟悉 Activiti,上手 Flowable 会非常快。
- 持续创新: 引入了一些新特性,如 CMMN(案例管理模型和符号)和 DMN(决策模型和符号)的更好支持。
- 企业级特性: 在一些企业级功能和稳定性上有所侧重。
- 同样有 Spring Boot 集成。
- 适用场景: 与 Activiti 类似,是 Activiti 的一个强力替代品,很多新项目会在这两者之间做选择。
Camunda BPM
- 简介: 一个功能非常全面的商业开源工作流引擎,提供了社区版和专业版。
- 特点:
- 功能最全: 除了工作流,还集成了流程引擎、规则引擎和决策引擎。
- 强大的操作控制台: 提供了非常强大的 Web 控制台,用于流程监控、任务管理和调试。
- 高性能和稳定性: 在大型、高并发的企业应用中表现优异。
- 社区版免费: 社区版已经足够强大,可以满足大部分需求。
- 适用场景: 对流程监控、调试和管理有高要求的大型企业级应用。
如何在工作流引擎中使用 Activity (以 Activiti/Flowable 为例)
下面是一个完整的、简化的示例,展示如何在 Java 项目中使用工作流引擎来处理一个包含“用户任务”和“服务任务”的 Activity。
项目集成 (以 Spring Boot 为例)
在 pom.xml 中添加依赖:
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.7.0</version> <!-- 使用合适的版本 -->
</dependency>
配置 application.yml:
activiti: # 自动检查并部署流程定义 check-process-definitions: true # 数据库配置(会自动创建 activiti 相关的表) database-schema-update: true
定义流程 (BPMN 2.0)
在 src/main/resources/processes/ 目录下创建 leave-request.bpmn20.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="Examples">
<process id="leaveRequestProcess" name="请假申请流程">
<!-- 开始事件 -->
<startEvent id="startEvent" />
<!-- 用户任务:部门经理审批 -->
<userTask id="managerApproval" name="部门经理审批" activiti:candidateGroups="managers" />
<!-- 服务任务:发送审批结果邮件 -->
<serviceTask id="sendEmailResult" name="发送邮件" activiti:class="com.example.workflow.SendResultEmailService" />
<!-- 结束事件 -->
<endEvent id="endEvent" />
<!-- 流程线 -->
<sequenceFlow id="flow1" sourceRef="startEvent" targetRef="managerApproval" />
<sequenceFlow id="flow2" sourceRef="managerApproval" targetRef="sendEmailResult" />
<sequenceFlow id="flow3" sourceRef="sendEmailResult" targetRef="endEvent" />
</process>
</definitions>
编写 Java 代码
-
服务任务实现类:
package com.example.workflow; import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.JavaDelegate; import org.springframework.stereotype.Component; @Component public class SendResultEmailService implements JavaDelegate { @Override public void execute(DelegateExecution execution) { // 从流程变量中获取数据 String applicant = (String) execution.getVariable("applicant"); boolean approved = (boolean) execution.getVariable("approved"); String result = approved ? "批准" : "拒绝"; // 模拟发送邮件 System.out.println("正在向 " + applicant + " 发送邮件,审批结果:" + result); // ... 实际的邮件发送逻辑 ... } } -
流程启动和任务处理的服务类:
package com.example.workflow; import org.activiti.engine.TaskService; import org.activiti.engine.task.Task; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.HashMap; import java.util.Map; @Service public class LeaveRequestService { @Autowired private org.activiti.engine.ProcessEngine processEngine; public void startLeaveRequest(String applicantName) { // 设置流程变量 Map<String, Object> variables = new HashMap<>(); variables.put("applicant", applicantName); // 其他变量... // 启动流程 processEngine.getRuntimeService() .startProcessInstanceByKey("leaveRequestProcess", variables); System.out.println("请假流程已为 " + applicantName + " 启动。"); } @Transactional public void approveTask(String taskId, boolean approved) { TaskService taskService = processEngine.getTaskService(); // 设置审批结果变量 Map<String, Object> variables = new HashMap<>(); variables.put("approved", approved); // 完成任务,并传入变量 taskService.complete(taskId, variables); System.out.println("任务 " + taskId + " 已被处理,结果:" + (approved ? "批准" : "拒绝")); } }
使用流程
你可以在 Controller 或其他业务代码中调用 LeaveRequestService 来启动流程和处理任务。
Android 中的 Activity (作为对比)
为了避免混淆,这里简单提一下 Android 中的 Activity。
- 是什么: 它是 Android 应用程序的一个屏幕或页面,一个 App 通常由多个
Activity组成。 - 作用: 负责提供用户界面,响应用户的交互(如点击按钮、输入文本)。
- 生命周期:
Activity有一个明确的生命周期,包括onCreate(),onStart(),onResume(),onPause(),onStop(),onDestroy()等方法,系统会根据其状态变化来调用这些方法。 - 与工作流引擎无关: Android
Activity是 Android SDK 的一部分,用于构建移动应用 UI,与上面讨论的业务流程管理引擎没有任何关系。
| 特性 | 工作流引擎中的 Activity | Android 中的 Activity |
|---|---|---|
| 所属领域 | 业务流程管理 | 移动应用开发 |
| 核心概念 | 流程中的一个步骤/任务 | 应用的一个屏幕/页面 |
| 主要目的 | 定义和执行业务逻辑(人工或自动) | 构建用户界面和交互 |
| 技术实现 | BPMN 2.0 定义,由引擎驱动 | Java/Kotlin 类,由 Android 系统管理生命周期 |
| 典型场景 | 审批流、订单处理、自动化任务 | 登录页、列表页、详情页 |
当你在 Java 后端开发中听到“工作流”和“Activity”时,99% 的情况都是指 Activiti、Flowable 等引擎中的业务活动,希望这个详细的解释能帮助你完全理解这个概念!
