Skip to content

Commit 7db4d33

Browse files
committed
feat(assists): 添加步骤管理器和步骤实现基类
- 新增 StepManager 类,用于管理和执行自动化步骤 - 新增 StepImpl 类,作为步骤实现的基础类 - 更新 documents.md,添加 StepManager 和 StepImpl 的说明和使用示例 - 优化 StepOperator 类,增加步骤重复执行和链式调用支持
1 parent 01449ae commit 7db4d33

File tree

4 files changed

+215
-17
lines changed

4 files changed

+215
-17
lines changed

assists/src/main/java/com/ven/assists/stepper/StepImpl.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,39 @@ package com.ven.assists.stepper
33
import kotlinx.coroutines.Dispatchers
44
import kotlinx.coroutines.withContext
55

6+
/**
7+
* 步骤实现基类
8+
* 用于实现自动化脚本的基础类,提供步骤实现的框架和协程执行环境
9+
* 继承此类的子类需要实现onImpl方法来定义具体的步骤逻辑
10+
*/
611
abstract class StepImpl {
712

13+
/**
14+
* 步骤实现方法
15+
* 子类必须实现此方法来定义具体的步骤逻辑
16+
* 通过StepCollector来收集和注册步骤的具体实现
17+
*
18+
* @param collector 步骤收集器,用于注册步骤的具体实现
19+
*/
820
abstract fun onImpl(collector: StepCollector)
921

1022
/**
1123
* IO协程执行任务
24+
* 在Dispatchers.IO协程上下文中执行指定的挂起函数
25+
* 适用于执行IO操作、网络请求等耗时任务
26+
*
27+
* @param function 要执行的挂起函数
1228
*/
1329
suspend fun runIO(function: suspend () -> Unit) {
1430
withContext(Dispatchers.IO) { function.invoke() }
1531
}
1632

1733
/**
1834
* 主协程执行任务
35+
* 在Dispatchers.Main协程上下文中执行指定的挂起函数
36+
* 适用于执行UI操作、更新界面等需要在主线程进行的任务
37+
*
38+
* @param function 要执行的挂起函数
1939
*/
2040
suspend fun runMain(function: suspend () -> Unit) {
2141
withContext(Dispatchers.Main) { function.invoke() }

assists/src/main/java/com/ven/assists/stepper/StepManager.kt

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,43 @@ import kotlinx.coroutines.Dispatchers
77
import kotlinx.coroutines.Job
88
import kotlinx.coroutines.cancel
99

10-
1110
/**
1211
* 步骤管理器
12+
* 用于管理和执行自动化步骤的核心类。提供步骤注册、执行、监听等功能,
13+
* 支持协程异步执行和步骤间延时控制。
1314
*/
1415
object StepManager {
15-
//步骤默认间隔时长
16+
/**
17+
* 步骤默认间隔时长(毫秒)
18+
* 用于控制连续步骤执行之间的默认等待时间
19+
*/
1620
var DEFAULT_STEP_DELAY = 1000L
1721

18-
//步骤监听器
22+
/**
23+
* 步骤监听器
24+
* 用于监听步骤执行的状态和进度
25+
*/
1926
var stepListeners: StepListener? = null
2027

28+
/**
29+
* 步骤收集器映射
30+
* 存储所有已注册的步骤实现类及其对应的步骤收集器
31+
* key: 步骤实现类的完整类名
32+
* value: 对应的步骤收集器实例
33+
*/
2134
private val stepCollector: HashMap<String, StepCollector> = hashMapOf()
2235

36+
/**
37+
* 协程作业实例
38+
* 用于管理步骤执行的协程生命周期
39+
*/
2340
private var job = Job()
2441

42+
/**
43+
* 协程作用域
44+
* 提供步骤异步执行的协程环境
45+
* 当job被取消或不活跃时会自动创建新的协程作用域
46+
*/
2547
var coroutine: CoroutineScope = CoroutineScope(job + Dispatchers.IO)
2648
private set
2749
get() {
@@ -32,12 +54,10 @@ object StepManager {
3254
return field
3355
}
3456

35-
36-
37-
3857
/**
3958
* 控制停止操作的变量
40-
* 当设置为true时,将取消步骤器下的所有步骤(需要执行步骤时需要设置为false)
59+
* 当设置为true时,将取消步骤器下的所有步骤
60+
* 在执行新的步骤前需要将其设置为false
4161
*/
4262
var isStop = false
4363
set(value) {
@@ -48,12 +68,28 @@ object StepManager {
4868
}
4969
}
5070

51-
71+
/**
72+
* 执行指定步骤
73+
*
74+
* @param stepImpl 步骤实现类的Class对象
75+
* @param stepTag 步骤标识
76+
* @param delay 步骤执行前的延迟时间(毫秒),默认使用DEFAULT_STEP_DELAY
77+
* @param data 传递给步骤的数据
78+
* @param begin 是否作为起始步骤(如果是,会重置isStop标志)
79+
*/
5280
fun <T : StepImpl> execute(stepImpl: Class<T>, stepTag: Int, delay: Long = DEFAULT_STEP_DELAY, data: Any? = null, begin: Boolean = false) {
5381
execute(stepImpl.name, stepTag, delay, data = data, begin = begin)
5482
}
5583

56-
84+
/**
85+
* 执行指定步骤
86+
*
87+
* @param implClassName 步骤实现类的完整类名
88+
* @param stepTag 步骤标识
89+
* @param delay 步骤执行前的延迟时间(毫秒),默认使用DEFAULT_STEP_DELAY
90+
* @param data 传递给步骤的数据
91+
* @param begin 是否作为起始步骤(如果是,会重置isStop标志)
92+
*/
5793
fun execute(implClassName: String, stepTag: Int, delay: Long = DEFAULT_STEP_DELAY, data: Any? = null, begin: Boolean = false) {
5894
if (begin) isStop = false
5995
if (isStop) return
@@ -70,7 +106,10 @@ object StepManager {
70106
}
71107

72108
/**
73-
* 注册业务实现类
109+
* 注册步骤实现类
110+
* 创建步骤收集器并初始化步骤实现类
111+
*
112+
* @param implClassName 步骤实现类的完整类名
74113
*/
75114
fun register(implClassName: String) {
76115
StepCollector(implClassName).let {

assists/src/main/java/com/ven/assists/stepper/StepOperator.kt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,39 @@ import kotlinx.coroutines.launch
99
import kotlinx.coroutines.withContext
1010
import kotlin.coroutines.cancellation.CancellationException
1111

12+
/**
13+
* 步骤操作器
14+
* 负责单个步骤的执行控制、状态管理和异常处理
15+
* 支持步骤的重复执行、链式调用和协程调度
16+
*
17+
* @property implClassName 步骤实现类的完整类名
18+
* @property step 步骤标识
19+
* @property next 步骤执行的核心逻辑,返回下一个要执行的步骤
20+
* @property isRunCoroutineIO 是否在IO线程执行,默认为false(在主线程执行)
21+
* @property data 步骤执行时的附加数据
22+
*/
1223
class StepOperator(
1324
val implClassName: String,
1425
val step: Int,
1526
val next: suspend (stepOperator: StepOperator) -> Step,
1627
val isRunCoroutineIO: Boolean = false,
1728
var data: Any? = null
1829
) {
30+
/**
31+
* 步骤重复执行的次数
32+
* 当步骤返回Step.repeat时会增加计数
33+
* 当步骤返回其他Step时重置为0
34+
*/
1935
var repeatCount = 0
2036
private set
2137

38+
/**
39+
* 执行步骤
40+
* 在协程中执行步骤,支持延迟执行和异常处理
41+
*
42+
* @param delay 执行前的延迟时间(毫秒)
43+
* @param data 可选的步骤数据,会覆盖原有的data属性
44+
*/
2245
fun execute(delay: Long, data: Any? = null) {
2346
this.data = data
2447
if (StepManager.isStop) {
@@ -49,6 +72,15 @@ class StepOperator(
4972
}
5073
}
5174

75+
/**
76+
* 处理下一个步骤
77+
* 根据步骤的返回值决定后续操作:
78+
* - Step.none: 停止执行
79+
* - Step.repeat: 重复当前步骤
80+
* - 其他: 执行指定的下一个步骤
81+
*
82+
* @param nextStep 下一个要执行的步骤
83+
*/
5284
private fun onNextStep(nextStep: Step) {
5385
when (nextStep) {
5486
Step.none -> {
@@ -77,6 +109,13 @@ class StepOperator(
77109
}
78110
}
79111

112+
/**
113+
* 执行步骤的核心逻辑
114+
* 处理步骤的生命周期回调和拦截逻辑
115+
*
116+
* @param next 步骤执行的具体逻辑
117+
* @return 下一个要执行的步骤
118+
*/
80119
private suspend fun onStep(next: suspend (stepOperator: StepOperator) -> Step): Step {
81120
StepManager.stepListeners?.onStepStart(this)
82121
StepManager.stepListeners?.onIntercept(this)?.let { return it }

documents.md

Lines changed: 107 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,18 +115,18 @@ Assists.getAllNodes().forEach { it.logNode() }
115115
|-|-|
116116
|[AssistsService](#assistsservice)|AccessibilityService服务类|
117117
|[AssistsCore](#assistscore)|基础类,对AccessibilityService API进行一系列的包装便于调用|
118-
|[AssistsWindowManager](#)|浮窗管理,管理浮窗添加、删除、触控手势切换、隐藏、浮窗toast|
119-
|[AssistsWindowWrapper](#)|浮窗包装,对浮窗移动、缩放做统一包装|
118+
|[AssistsWindowManager](#assistswindowmanager)|浮窗管理,管理浮窗添加、删除、触控手势切换、隐藏、浮窗toast|
119+
|[AssistsWindowWrapper](#assistswindowwrapper)|浮窗包装,对浮窗移动、缩放做统一包装|
120120
## 进阶
121121
||描述|
122122
|-|-|
123-
|[MPManager](#)|屏幕录制管理,利用屏幕录制截取屏幕内容快捷获取图片,结合OpencvWrapper可以对图片进行识别操作等|
124-
|[OpencvWrapper](#)|Opencv包装,当前仅结合[MPManager](#)做简单的模版匹配包装,可自行结合[Assists]()[MPManager](#)做更深层包装实现基于机器视觉的自动化|
123+
|[MPManager](#mpmanager)|屏幕录制管理,利用屏幕录制截取屏幕内容快捷获取图片,结合OpencvWrapper可以对图片进行识别操作等|
124+
|[OpencvWrapper](#opencvwrapper)|Opencv包装,当前仅结合[MPManager](#mpmanager)做简单的模版匹配包装,可自行结合[Assists](#assistscore)[MPManager](#mpmanager)做更深层包装实现基于机器视觉的自动化|
125125
## 高级
126126
||描述|
127127
|-|-|
128-
|[StepManager](#)|步骤管理器,对于实现自动化脚本提供一个快速实现业务、可复用、易维护的步骤框架及管理器|
129-
|[StepImpl](#)|步骤实现类,用于实现自动化脚本时继承此类|
128+
|[StepManager](#stepmanager)|步骤管理器,对于实现自动化脚本提供一个快速实现业务、可复用、易维护的步骤框架及管理器|
129+
|[StepImpl](#stepimpl)|步骤实现类,用于实现自动化脚本时继承此类|
130130

131131
### AssistsService
132132
无障碍服务核心类,负责处理无障碍服务的生命周期和事件分发,提供全局服务实例访问和监听器管理功能。
@@ -794,4 +794,104 @@ val result = OpencvWrapper.matchTemplate(screenMat, templateMat, mask)
794794
2. 模板匹配支持掩膜操作,可以指定匹配区域
795795
3. 获取匹配结果时可以设置忽略距离,避免相近位置重复匹配
796796
4. 所有涉及图像操作的方法都需要注意空值处理
797-
5. 图像掩膜创建支持HSV颜色空间的阈值分割,可以更精确地控制匹配区域
797+
5. 图像掩膜创建支持HSV颜色空间的阈值分割,可以更精确地控制匹配区域
798+
799+
### StepManager
800+
步骤管理器,用于管理和执行自动化步骤的核心类。提供步骤注册、执行、监听等功能,支持协程异步执行和步骤间延时控制。
801+
802+
#### 重要属性
803+
804+
|属性|描述|
805+
|-|-|
806+
|`DEFAULT_STEP_DELAY`|步骤默认间隔时长(毫秒),用于控制连续步骤执行之间的默认等待时间|
807+
|`stepListeners`|步骤监听器,用于监听步骤执行的状态和进度|
808+
|`stepCollector`|步骤收集器映射,存储所有已注册的步骤实现类及其对应的步骤收集器|
809+
|`coroutine`|协程作用域,提供步骤异步执行的协程环境|
810+
|`isStop`|控制停止操作的变量,当设置为true时,将取消步骤器下的所有步骤|
811+
812+
#### 核心方法
813+
814+
|方法|描述|
815+
|-|-|
816+
|`execute(stepImpl: Class<T>, stepTag: Int, delay: Long, data: Any?, begin: Boolean)`|执行指定步骤,支持通过Class对象指定步骤实现类|
817+
|`execute(implClassName: String, stepTag: Int, delay: Long, data: Any?, begin: Boolean)`|执行指定步骤,支持通过类名字符串指定步骤实现类|
818+
|`register(implClassName: String)`|注册步骤实现类,创建步骤收集器并初始化步骤实现类|
819+
820+
#### 使用示例
821+
822+
1. 注册和执行步骤
823+
```kotlin
824+
// 注册步骤实现类
825+
StepManager.register("com.example.MyStepImpl")
826+
827+
// 执行步骤
828+
StepManager.execute(
829+
MyStepImpl::class.java, // 步骤实现类
830+
stepTag = 1, // 步骤标识
831+
delay = 1000, // 延迟执行时间
832+
data = "some data", // 步骤数据
833+
begin = true // 作为起始步骤
834+
)
835+
```
836+
837+
2. 停止步骤执行
838+
```kotlin
839+
// 设置停止标志,将取消所有正在执行的步骤
840+
StepManager.isStop = true
841+
```
842+
843+
#### 注意事项
844+
845+
1. 执行步骤前需要先注册对应的步骤实现类
846+
2. 步骤执行支持延迟和数据传递
847+
3. 可以通过begin参数指定是否作为起始步骤(会重置isStop标志)
848+
4. 步骤执行在协程中进行,支持异步操作
849+
850+
### StepImpl
851+
步骤实现基类,用于实现自动化脚本的基础类,提供步骤实现的框架和协程执行环境。继承此类的子类需要实现onImpl方法来定义具体的步骤逻辑。
852+
853+
#### 核心方法
854+
855+
|方法|描述|
856+
|-|-|
857+
|`onImpl(collector: StepCollector)`|步骤实现方法,子类必须实现此方法来定义具体的步骤逻辑|
858+
|`runIO(function: suspend () -> Unit)`|在IO线程执行任务,适用于执行IO操作、网络请求等耗时任务|
859+
|`runMain(function: suspend () -> Unit)`|在主线程执行任务,适用于执行UI操作、更新界面等任务|
860+
861+
#### 使用示例
862+
863+
1. 创建步骤实现类
864+
```kotlin
865+
class MyStepImpl : StepImpl() {
866+
override fun onImpl(collector: StepCollector) {
867+
// 注册步骤1
868+
collector.collect(1) { operator ->
869+
// 在IO线程执行耗时操作
870+
runIO {
871+
// 执行耗时任务
872+
}
873+
874+
// 在主线程更新UI
875+
runMain {
876+
// 更新界面
877+
}
878+
879+
// 返回下一步
880+
Step.next(2)
881+
}
882+
883+
// 注册步骤2
884+
collector.collect(2) { operator ->
885+
// 步骤逻辑
886+
Step.none
887+
}
888+
}
889+
}
890+
```
891+
892+
#### 注意事项
893+
894+
1. 子类必须实现onImpl方法来定义步骤逻辑
895+
2. 使用runIO执行耗时操作,避免阻塞主线程
896+
3. 使用runMain执行UI相关操作,确保在主线程更新界面
897+
4. 每个步骤都需要返回一个Step对象来指示下一步操作

0 commit comments

Comments
 (0)