Skip to content

Commit 294c022

Browse files
committed
docs(AssistsService): 更新 AssistsService 文档并添加详细注释
- 在 AssistsService.kt 文件中添加了详细的类和方法注释 - 更新了 documents.md 文件,增加了 AssistsService 的详细说明 - 新增了 AssistsWindowManager 和 AssistsWindowWrapper 的文档说明 - 优化了文档结构,使其更加清晰易读
1 parent 19d0336 commit 294c022

File tree

2 files changed

+171
-2
lines changed

2 files changed

+171
-2
lines changed

assists/src/main/java/com/ven/assists/service/AssistsService.kt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,43 @@ import com.ven.assists.AssistsCore
88
import com.ven.assists.window.AssistsWindowManager
99
import java.util.Collections
1010

11+
/**
12+
* 无障碍服务核心类
13+
* 负责处理无障碍服务的生命周期和事件分发
14+
* 提供全局服务实例访问和监听器管理功能
15+
*/
1116
class AssistsService : AccessibilityService() {
1217
companion object {
18+
/**
19+
* 全局服务实例
20+
* 用于在应用中获取无障碍服务实例
21+
* 当服务未启动或被销毁时为null
22+
*/
1323
var instance: AssistsService? = null
1424
private set
1525

26+
/**
27+
* 服务监听器列表
28+
* 使用线程安全的集合存储所有监听器
29+
* 用于分发服务生命周期和无障碍事件
30+
*/
1631
val listeners: MutableList<AssistsServiceListener> = Collections.synchronizedList(arrayListOf<AssistsServiceListener>())
1732
}
1833

34+
/**
35+
* 服务创建时调用
36+
* 初始化全局服务实例
37+
*/
1938
override fun onCreate() {
2039
super.onCreate()
2140
instance = this
2241
}
2342

43+
/**
44+
* 服务连接成功时调用
45+
* 初始化服务实例和窗口管理器
46+
* 通知所有监听器服务已连接
47+
*/
2448
override fun onServiceConnected() {
2549
super.onServiceConnected()
2650
instance = this
@@ -29,17 +53,32 @@ class AssistsService : AccessibilityService() {
2953
LogUtils.d(AssistsCore.LOG_TAG, "assists service on service connected")
3054
}
3155

56+
/**
57+
* 接收无障碍事件
58+
* 更新服务实例并分发事件给所有监听器
59+
* @param event 无障碍事件对象
60+
*/
3261
override fun onAccessibilityEvent(event: AccessibilityEvent) {
3362
instance = this
3463
runCatching { listeners.forEach { it.onAccessibilityEvent(event) } }
3564
}
3665

66+
/**
67+
* 服务解绑时调用
68+
* 清除服务实例并通知所有监听器
69+
* @param intent 解绑的Intent
70+
* @return 是否调用父类的onUnbind方法
71+
*/
3772
override fun onUnbind(intent: Intent?): Boolean {
3873
instance = null
3974
runCatching { listeners.forEach { it.onUnbind() } }
4075
return super.onUnbind(intent)
4176
}
4277

78+
/**
79+
* 服务中断时调用
80+
* 通知所有监听器服务已中断
81+
*/
4382
override fun onInterrupt() {
4483
runCatching { listeners.forEach { it.onInterrupt() } }
4584
}

documents.md

Lines changed: 132 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ Assists.getAllNodes().forEach { it.logNode() }
113113
## 基础
114114
||描述|
115115
|-|-|
116-
|[AssistsService](#)|AccessibilityService服务类|
116+
|[AssistsService](#assistsservice)|AccessibilityService服务类|
117117
|[AssistsCore](#assistscore)|基础类,对AccessibilityService API进行一系列的包装便于调用|
118118
|[AssistsWindowManager](#)|浮窗管理,管理浮窗添加、删除、触控手势切换、隐藏、浮窗toast|
119119
|[AssistsWindowWrapper](#)|浮窗包装,对浮窗移动、缩放做统一包装|
@@ -129,7 +129,24 @@ Assists.getAllNodes().forEach { it.logNode() }
129129
|[StepImpl](#)|步骤实现类,用于实现自动化脚本时继承此类|
130130

131131
### AssistsService
132+
无障碍服务核心类,负责处理无障碍服务的生命周期和事件分发,提供全局服务实例访问和监听器管理功能。
132133

134+
#### 重要属性
135+
136+
|属性|描述|
137+
|-|-|
138+
|`instance`|全局服务实例。用于在应用中获取无障碍服务实例,当服务未启动或被销毁时为null|
139+
|`listeners`|服务监听器列表。使用线程安全的集合存储所有监听器,用于分发服务生命周期和无障碍事件|
140+
141+
#### 生命周期方法
142+
143+
|方法|描述|
144+
|-|-|
145+
|`onCreate()`|服务创建时调用,初始化全局服务实例|
146+
|`onServiceConnected()`|服务连接成功时调用,初始化服务实例和窗口管理器,通知所有监听器服务已连接|
147+
|`onAccessibilityEvent(event: AccessibilityEvent)`|接收无障碍事件,更新服务实例并分发事件给所有监听器|
148+
|`onUnbind(intent: Intent?)`|服务解绑时调用,清除服务实例并通知所有监听器|
149+
|`onInterrupt()`|服务中断时调用,通知所有监听器服务已中断|
133150

134151
### AssistsCore
135152
> *通过Assists对界面进行操作和获取信息,需要先查看界面有哪些元素、元素的结构、元素信息,有了这些才能通过Assists去获取元素并操作。如何查看可参考[这里](https://blog.csdn.net/weixin_37496178/article/details/138328871?spm=1001.2014.3001.5502)*
@@ -539,4 +556,117 @@ AccessibilityNodeInfo.nodeGestureClick(
539556
参数:
540557
- `tag`:日志标签,默认为LOG_TAG("assists_log")
541558

542-
---
559+
---
560+
561+
### AssistsWindowManager
562+
浮窗管理器,提供全局浮窗的添加、删除、显示、隐藏等管理功能。
563+
564+
#### 重要属性
565+
566+
|属性|描述|
567+
|-|-|
568+
|`windowManager`|系统窗口管理器|
569+
|`mDisplayMetrics`|显示度量信息|
570+
|`viewList`|浮窗视图列表,使用线程安全的集合|
571+
572+
#### 核心方法
573+
574+
|方法|描述|
575+
|-|-|
576+
|`init(accessibilityService: AccessibilityService)`|初始化窗口管理器|
577+
|`getWindowManager()`|获取系统窗口管理器实例|
578+
|`createLayoutParams()`|创建默认的浮窗布局参数|
579+
|`hideAll(isTouchable: Boolean = true)`|隐藏所有浮窗|
580+
|`hideTop(isTouchable: Boolean = true)`|隐藏最顶层浮窗|
581+
|`showTop(isTouchable: Boolean = true)`|显示最顶层浮窗|
582+
|`showAll(isTouchable: Boolean = true)`|显示所有浮窗|
583+
|`add(windowWrapper: AssistsWindowWrapper?, isStack: Boolean = true, isTouchable: Boolean = true)`|添加浮窗包装器|
584+
|`add(view: View?, layoutParams: WindowManager.LayoutParams, isStack: Boolean = true, isTouchable: Boolean = true)`|添加浮窗视图|
585+
|`push(view: View?, params: WindowManager.LayoutParams)`|添加浮窗并隐藏之前的浮窗|
586+
|`pop(showTop: Boolean = true)`|移除最顶层浮窗并显示下一个浮窗|
587+
|`removeView(view: View?)`|移除指定浮窗|
588+
|`contains(view: View?)`|检查指定视图是否已添加为浮窗|
589+
|`contains(wrapper: AssistsWindowWrapper?)`|检查指定浮窗包装器是否已添加|
590+
|`isVisible(view: View)`|检查指定浮窗是否可见|
591+
|`updateViewLayout(view: View, params: ViewGroup.LayoutParams)`|更新浮窗布局|
592+
|`touchableByAll()`|设置所有浮窗为可触摸状态|
593+
|`nonTouchableByAll()`|设置所有浮窗为不可触摸状态|
594+
595+
#### 扩展方法
596+
597+
|方法|描述|
598+
|-|-|
599+
|`WindowManager.LayoutParams.touchableByLayoutParams()`|设置布局参数为可触摸状态|
600+
|`WindowManager.LayoutParams.nonTouchableByLayoutParams()`|设置布局参数为不可触摸状态|
601+
|`ViewWrapper.touchableByWrapper()`|设置浮窗包装器为可触摸状态|
602+
|`ViewWrapper.nonTouchableByWrapper()`|设置浮窗包装器为不可触摸状态|
603+
|`String.overlayToast(delay: Long = 2000)`|显示一个临时的Toast样式浮窗|
604+
605+
#### ViewWrapper类
606+
浮窗视图包装类,用于管理浮窗视图及其布局参数
607+
608+
|属性|描述|
609+
|-|-|
610+
|`view`|浮窗视图|
611+
|`layoutParams`|布局参数|
612+
613+
### AssistsWindowWrapper
614+
浮窗包装类,为浮窗提供统一的外观和交互行为,包括:
615+
1. 可拖动移动位置
616+
2. 可缩放大小
617+
3. 可关闭
618+
4. 支持自定义初始位置和大小限制
619+
620+
#### 构造参数
621+
622+
|参数|描述|
623+
|-|-|
624+
|`view`|要包装的视图|
625+
|`wmLayoutParams`|窗口布局参数,可选|
626+
|`onClose`|关闭回调函数,可选|
627+
628+
#### 属性配置
629+
630+
|属性|描述|默认值|
631+
|-|-|-|
632+
|`minHeight`|最小高度限制|-1(无限制)|
633+
|`minWidth`|最小宽度限制|-1(无限制)|
634+
|`maxHeight`|最大高度限制|-1(无限制)|
635+
|`maxWidth`|最大宽度限制|-1(无限制)|
636+
|`initialX`|初始X坐标|0|
637+
|`initialY`|初始Y坐标|0|
638+
|`initialXOffset`|X轴偏移量|0|
639+
|`initialYOffset`|Y轴偏移量|0|
640+
|`initialCenter`|是否初始居中显示|false|
641+
|`showOption`|是否显示操作按钮(移动、缩放、关闭)|true|
642+
|`showBackground`|是否显示背景|true|
643+
|`wmlp`|窗口布局参数|默认布局参数|
644+
645+
#### 核心方法
646+
647+
|方法|描述|
648+
|-|-|
649+
|`ignoreTouch()`|设置浮窗为不可触摸状态,此状态下浮窗将忽略所有触摸事件|
650+
|`consumeTouch()`|设置浮窗为可触摸状态,此状态下浮窗可以响应触摸事件|
651+
|`getView()`|获取浮窗的根视图|
652+
653+
#### 内部实现
654+
655+
##### 触摸事件监听器
656+
657+
1. 缩放触摸事件监听器(onTouchScaleListener)
658+
- 处理浮窗的缩放操作
659+
- 记录初始触摸位置和布局尺寸
660+
- 根据触摸移动计算新的宽高
661+
- 应用尺寸限制条件
662+
663+
2. 移动触摸事件监听器(onTouchMoveListener)
664+
- 处理浮窗的拖动移动操作
665+
- 根据触摸位置更新浮窗坐标
666+
- 考虑状态栏高度的偏移
667+
668+
##### 视图绑定(viewBinding)
669+
- 初始化浮窗的布局和行为
670+
- 处理初始位置和显示
671+
- 设置移动、缩放和关闭按钮的事件监听
672+
- 根据配置显示或隐藏操作按钮和背景

0 commit comments

Comments
 (0)