refactor(voice): 重构离线语音命令服务实现

- 提取通用关键词到 COMMON_CMDS 常量中
- 添加 registerBeans 和 removeBeans 辅助方法统一管理语音命令
- 在初始化时注册通用关键词,避免在每个页面重复注册
- 为每个页面添加对应的移除方法,在页面离开时清理独有关键词
- 将页面特定关键词注册从 initData 移至 onResume,注销从 onDestroy 移至 onPause
- 删除不再使用的 addListenerFo 方法中的重复代码
- 统一管理页面生命周期中的语音命令注册和注销逻辑
这个提交包含在:
徐勤民 2026-04-15 13:48:59 +08:00
父节点 5632119792
当前提交 2d8770040f
共有 10 个文件被更改,包括 203 次插入205 次删除

查看文件

@ -81,43 +81,48 @@ object OfflineCmdServiceHelper {
// //
} }
// 所有页面通用关键词
private val COMMON_CMDS = listOf(
OfflineCmdBean("退出", "tui chu"),
OfflineCmdBean("返回", "fan hui")
)
private var service: IOfflineCmdService? = null private var service: IOfflineCmdService? = null
private fun registerBeans(beans: List<OfflineCmdBean>) {
for (bean in beans) {
LogHelper.d("------>>>>>>>>>--------${service !== null}")
service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
override fun onVoiceTriggered() {
LogHelper.d("onOfflineCmd: ${bean.text}")
for (l in listenerList) {
l.onOfflineCmd(bean.text)
}
}
}))
}
}
private val noopCallback = object : IVoiceCallback.Stub() {
override fun onVoiceTriggered() {}
}
private fun removeBeans(beans: List<OfflineCmdBean>) {
for (bean in beans) {
service?.remove(VoiceAction(bean.text, bean.pinyin, noopCallback))
}
}
private fun addCommonCmds() {
registerBeans(COMMON_CMDS)
}
@Synchronized @Synchronized
fun init(){ fun init(){
service = GlassSdk.getGlassOfflineCmdService() service = GlassSdk.getGlassOfflineCmdService()
// LogHelper.d("init") // 通用关键词在 init 时注册一次,页面切换不会移除它们
// if (initialized || initializing) { addCommonCmds()
// return
// }
// LogHelper.d("init111")
// initializing = true
// LogHelper.d("init222")
// initExecutor.execute {
// try {
// val service = GlassSdk.getGlassOfflineCmdService()
// if (service == null){
// LogHelper.e("OfflineCmdServiceHelper","service is null")
// return@execute
// }
// LogHelper.d("init444")
// LogHelper.e("OfflineCmdServiceHelper","service 存在")
// for (bean in list) {
// service.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
// override fun onVoiceTriggered() {
// LogHelper.d("onOfflineCmd: ${bean.text}")
// for (l in listenerList) {
// l.onOfflineCmd(bean.text)
// }
// }
// }))
// }
// LogHelper.d("init555")
// initialized = true
// } finally {
// LogHelper.d("init333")
// initializing = false
// }
// }
} }
fun addOnLineListener(listener: OfflineCmdListener){ fun addOnLineListener(listener: OfflineCmdListener){
this.listenerList.add(listener) this.listenerList.add(listener)
@ -127,175 +132,149 @@ object OfflineCmdServiceHelper {
} }
fun addListenerList(){ fun addListenerList(){
for (bean in mutableListOf<OfflineCmdBean>().apply { // 任务列表独有关键词(通用关键词已在 init 注册,无需重复)
// 任务列表 registerBeans(listOf(
add(OfflineCmdBean("下一页", "xia yi ye")) OfflineCmdBean("下一页", "xia yi ye"),
add(OfflineCmdBean("上一页", "shang yi ye")) OfflineCmdBean("上一页", "shang yi ye"),
OfflineCmdBean("查看第一项任务", "cha kan di yi xiang ren wu"),
add(OfflineCmdBean("退出", "tui chu")) OfflineCmdBean("第一个", "di yi ge"),
add(OfflineCmdBean("返回", "fan hui")) OfflineCmdBean("查看第二项任务", "cha kan di er xiang ren wu"),
OfflineCmdBean("第二个", "di er ge"),
add(OfflineCmdBean("查看第一项任务", "cha kan di yi xiang ren wu")) OfflineCmdBean("查看第三项任务", "cha kan di san xiang ren wu"),
add(OfflineCmdBean("第一个", "di yi ge")) OfflineCmdBean("第三个", "di san ge"),
OfflineCmdBean("查看第四项任务", "cha kan di si xiang ren wu"),
add(OfflineCmdBean("查看第二项任务", "cha kan di er xiang ren wu")) OfflineCmdBean("第四个", "di si ge"),
add(OfflineCmdBean("第二个", "di er ge")) OfflineCmdBean("查看第五项任务", "cha kan di wu xiang ren wu"),
OfflineCmdBean("第五个", "di wu ge"),
add(OfflineCmdBean("查看第三项任务", "cha kan di san xiang ren wu")) OfflineCmdBean("查看第六项任务", "cha kan di liu xiang ren wu"),
add(OfflineCmdBean("第三个", "di san ge")) OfflineCmdBean("第六个", "di liu ge")
))
add(OfflineCmdBean("查看第四项任务", "cha kan di si xiang ren wu"))
add(OfflineCmdBean("第四个", "di si ge"))
add(OfflineCmdBean("查看第五项任务", "cha kan di wu xiang ren wu"))
add(OfflineCmdBean("第五个", "di wu ge"))
add(OfflineCmdBean("查看第六项任务", "cha kan di liu xiang ren wu"))
add(OfflineCmdBean("第六个", "di liu ge"))
}) {
LogHelper.d("------>>>>>>>>>--------${service!==null}")
service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
override fun onVoiceTriggered() {
LogHelper.d("onOfflineCmd: ${bean.text}")
for (l in listenerList) {
l.onOfflineCmd(bean.text)
}
}
}))
}
} }
fun removeAll(){ fun removeAll(){
service?.removeAll() service?.removeAll()
} }
fun addListenerFo(){ // addListenerFo: 无独有关键词,通用关键词已在 init 注册
for (bean in mutableListOf<OfflineCmdBean>().apply { fun addListenerFo(){ }
add(OfflineCmdBean("退出", "tui chu"))
add(OfflineCmdBean("返回", "fan hui"))
}) {
LogHelper.d("------>>>>>>>>>--------${service!==null}")
service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
override fun onVoiceTriggered() {
LogHelper.d("onOfflineCmd: ${bean.text}")
for (l in listenerList) {
l.onOfflineCmd(bean.text)
}
}
}))
}
}
fun addListenerInspection(){ fun addListenerInspection(){
for (bean in mutableListOf<OfflineCmdBean>().apply { // 巡检页独有关键词
add(OfflineCmdBean("退出", "tui chu")) registerBeans(listOf(
add(OfflineCmdBean("返回", "fan hui")) OfflineCmdBean("驳回", "bo hui"),
add(OfflineCmdBean("驳回", "bo hui")) OfflineCmdBean("通过", "tong guo"),
add(OfflineCmdBean("通过", "tong guo")) OfflineCmdBean("同意", "tong yi")
add(OfflineCmdBean("同意", "bo hui")) ))
}) {
LogHelper.d("------>>>>>>>>>--------${service!==null}")
service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
override fun onVoiceTriggered() {
LogHelper.d("onOfflineCmd: ${bean.text}")
for (l in listenerList) {
l.onOfflineCmd(bean.text)
}
}
}))
}
} }
fun addListenerSpraying(){ fun addListenerSpraying(){
for (bean in mutableListOf<OfflineCmdBean>().apply { // 喷涂页独有关键词
add(OfflineCmdBean("退出", "tui chu")) registerBeans(listOf(
add(OfflineCmdBean("返回", "fan hui")) OfflineCmdBean("开始任务", "kai shi ren wu")
add(OfflineCmdBean("开始任务", "kai shi ren wu")) ))
}) {
LogHelper.d("------>>>>>>>>>--------${service!==null}")
service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
override fun onVoiceTriggered() {
LogHelper.d("onOfflineCmd: ${bean.text}")
for (l in listenerList) {
l.onOfflineCmd(bean.text)
}
}
}))
}
} }
fun addListenerSprayingFinish(){ fun addListenerSprayingFinish(){
for (bean in mutableListOf<OfflineCmdBean>().apply { // 喷涂完成页独有关键词
add(OfflineCmdBean("退出", "tui chu")) registerBeans(listOf(
add(OfflineCmdBean("返回", "fan hui")) OfflineCmdBean("补充照片", "bu chong zhao pian"),
add(OfflineCmdBean("补充照片", "bu chong zhao pian")) OfflineCmdBean("确认提交", "que ren ti jiao")
add(OfflineCmdBean("确认提交", "que ren ti jiao")) ))
}) {
LogHelper.d("------>>>>>>>>>--------${service!==null}")
service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
override fun onVoiceTriggered() {
LogHelper.d("onOfflineCmd: ${bean.text}")
for (l in listenerList) {
l.onOfflineCmd(bean.text)
}
}
}))
}
} }
fun addListenerSprayingManualResulth(){ fun addListenerSprayingManualResulth(){
for (bean in mutableListOf<OfflineCmdBean>().apply { // 喷涂人工更正页独有关键词
add(OfflineCmdBean("退出", "tui chu")) registerBeans(listOf(
add(OfflineCmdBean("返回", "fan hui")) OfflineCmdBean("合格", "he ge"),
add(OfflineCmdBean("合格", "he ge")) OfflineCmdBean("不合格", "bu he ge"),
add(OfflineCmdBean("不合格", "bu he ge")) OfflineCmdBean("取消", "qu xiao")
add(OfflineCmdBean("取消", "qu xiao")) ))
}) {
LogHelper.d("------>>>>>>>>>--------${service!==null}")
service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
override fun onVoiceTriggered() {
LogHelper.d("onOfflineCmd: ${bean.text}")
for (l in listenerList) {
l.onOfflineCmd(bean.text)
}
}
}))
}
} }
fun addListenerSprayingOCR(){ fun addListenerSprayingOCR(){
for (bean in mutableListOf<OfflineCmdBean>().apply { // 喷涂OCR页独有关键词
add(OfflineCmdBean("退出", "tui chu")) registerBeans(listOf(
add(OfflineCmdBean("返回", "fan hui")) OfflineCmdBean("重拍", "chong pai")
add(OfflineCmdBean("重拍", "chong pai")) ))
}) {
LogHelper.d("------>>>>>>>>>--------${service!==null}")
service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
override fun onVoiceTriggered() {
LogHelper.d("onOfflineCmd: ${bean.text}")
for (l in listenerList) {
l.onOfflineCmd(bean.text)
}
}
}))
}
} }
fun addListenerSprayingResult(){ fun addListenerSprayingResult(){
for (bean in mutableListOf<OfflineCmdBean>().apply { // 喷涂结果页独有关键词
add(OfflineCmdBean("退出", "tui chu")) registerBeans(listOf(
add(OfflineCmdBean("返回", "fan hui")) OfflineCmdBean("重拍", "chong pai"),
add(OfflineCmdBean("重拍", "chong pai")) OfflineCmdBean("继续拍摄", "ji xu pai she"),
add(OfflineCmdBean("继续拍摄", "ji xu pai she")) OfflineCmdBean("人工更正结果", "ren gong geng zheng jie guo"),
add(OfflineCmdBean("人工更正结果", "ren gong geng zheng jie guo")) OfflineCmdBean("更正", "geng zheng"),
add(OfflineCmdBean("更正", "geng zheng")) OfflineCmdBean("结束任务", "jie shu ren wu")
add(OfflineCmdBean("结束任务", "jie shu ren wu")) ))
}) {
LogHelper.d("------>>>>>>>>>--------${service!==null}")
service?.add(VoiceAction(bean.text, bean.pinyin, object : IVoiceCallback.Stub() {
override fun onVoiceTriggered() {
LogHelper.d("onOfflineCmd: ${bean.text}")
for (l in listenerList) {
l.onOfflineCmd(bean.text)
}
}
}))
}
} }
// ---- 各页面离开时移除独有关键词(退出/返回为公共关键词,不移除)----
fun removeListenerList(){
removeBeans(listOf(
OfflineCmdBean("下一页", "xia yi ye"),
OfflineCmdBean("上一页", "shang yi ye"),
OfflineCmdBean("查看第一项任务", "cha kan di yi xiang ren wu"),
OfflineCmdBean("第一个", "di yi ge"),
OfflineCmdBean("查看第二项任务", "cha kan di er xiang ren wu"),
OfflineCmdBean("第二个", "di er ge"),
OfflineCmdBean("查看第三项任务", "cha kan di san xiang ren wu"),
OfflineCmdBean("第三个", "di san ge"),
OfflineCmdBean("查看第四项任务", "cha kan di si xiang ren wu"),
OfflineCmdBean("第四个", "di si ge"),
OfflineCmdBean("查看第五项任务", "cha kan di wu xiang ren wu"),
OfflineCmdBean("第五个", "di wu ge"),
OfflineCmdBean("查看第六项任务", "cha kan di liu xiang ren wu"),
OfflineCmdBean("第六个", "di liu ge")
))
}
// addListenerFo 无独有关键词,无需对应 remove 方法
fun removeListenerInspection(){
removeBeans(listOf(
OfflineCmdBean("驳回", "bo hui"),
OfflineCmdBean("通过", "tong guo"),
OfflineCmdBean("同意", "tong yi")
))
}
fun removeListenerSpraying(){
removeBeans(listOf(
OfflineCmdBean("开始任务", "kai shi ren wu")
))
}
fun removeListenerSprayingFinish(){
removeBeans(listOf(
OfflineCmdBean("补充照片", "bu chong zhao pian"),
OfflineCmdBean("确认提交", "que ren ti jiao")
))
}
fun removeListenerSprayingManualResulth(){
removeBeans(listOf(
OfflineCmdBean("合格", "he ge"),
OfflineCmdBean("不合格", "bu he ge"),
OfflineCmdBean("取消", "qu xiao")
))
}
fun removeListenerSprayingOCR(){
removeBeans(listOf(
OfflineCmdBean("重拍", "chong pai")
))
}
fun removeListenerSprayingResult(){
removeBeans(listOf(
OfflineCmdBean("重拍", "chong pai"),
OfflineCmdBean("继续拍摄", "ji xu pai she"),
OfflineCmdBean("人工更正结果", "ren gong geng zheng jie guo"),
OfflineCmdBean("更正", "geng zheng"),
OfflineCmdBean("结束任务", "jie shu ren wu")
))
}
} }

查看文件

@ -25,16 +25,17 @@ class FoActivity : BaseActivity<ActivityFoBinding>() {
} }
override fun initData() { override fun initData() {
super.initData() super.initData()
OfflineCmdServiceHelper.addListenerFo()
OfflineCmdServiceHelper.addOnLineListener(listener)
val html = "<b>加粗</b> <br><br>换行 <br><br><h1>h1</h1>" val html = "<b>加粗</b> <br><br>换行 <br><br><h1>h1</h1>"
binding.content.text = Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY) binding.content.text = Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY)
} }
override fun onResume() {
super.onResume()
OfflineCmdServiceHelper.addOnLineListener(listener)
}
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
OfflineCmdServiceHelper.removeAll()
OfflineCmdServiceHelper.removeOnLineListener(listener) OfflineCmdServiceHelper.removeOnLineListener(listener)
} }
} }

查看文件

@ -38,22 +38,23 @@ class InspectionActivity : BaseListFormLayoutNormalActivity<ItemItem, ItemListVM
override fun initData() { override fun initData() {
super.initData() super.initData()
window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
OfflineCmdServiceHelper.addListenerInspection()
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
OfflineCmdServiceHelper.addListenerInspection()
OfflineCmdServiceHelper.addOnLineListener(listener) OfflineCmdServiceHelper.addOnLineListener(listener)
} }
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
OfflineCmdServiceHelper.removeListenerInspection()
OfflineCmdServiceHelper.removeOnLineListener(listener) OfflineCmdServiceHelper.removeOnLineListener(listener)
} }
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
OfflineCmdServiceHelper.removeAll() window.clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
} }
private val adapter = object : CommonPagedAdapter<ItemItem>(R.layout.item_item) { private val adapter = object : CommonPagedAdapter<ItemItem>(R.layout.item_item) {
override fun convert(holder: ViewHolder, item: ItemItem, position: Int) { override fun convert(holder: ViewHolder, item: ItemItem, position: Int) {

查看文件

@ -37,15 +37,24 @@ class ReviewActivity : BaseListFormLayoutNormalActivity<ItemItem, ItemListVM, Ac
} }
override fun initData() { override fun initData() {
super.initData() super.initData()
OfflineCmdServiceHelper.addListenerInspection()
window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
override fun onResume() {
super.onResume()
OfflineCmdServiceHelper.addListenerInspection()
OfflineCmdServiceHelper.addOnLineListener(listener) OfflineCmdServiceHelper.addOnLineListener(listener)
} }
override fun onPause() {
super.onPause()
OfflineCmdServiceHelper.removeListenerInspection()
OfflineCmdServiceHelper.removeOnLineListener(listener)
}
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
OfflineCmdServiceHelper.removeOnLineListener(listener) window.clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
OfflineCmdServiceHelper.removeAll()
} }
private val adapter = object : CommonPagedAdapter<ItemItem>(R.layout.item_item) { private val adapter = object : CommonPagedAdapter<ItemItem>(R.layout.item_item) {

查看文件

@ -111,9 +111,9 @@ class SprayingActivity :
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
OfflineCmdServiceHelper.removeListenerSpraying()
OfflineCmdServiceHelper.removeOnLineListener(listener) OfflineCmdServiceHelper.removeOnLineListener(listener)
GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback) GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback)
OfflineCmdServiceHelper.removeAll()
} }
private var isPhoto = false private var isPhoto = false

查看文件

@ -40,18 +40,26 @@ class SprayingFinishActivity :
override fun initData() { override fun initData() {
super.initData() super.initData()
OfflineCmdServiceHelper.addOnLineListener(listener)
OfflineCmdServiceHelper.addListenerSprayingFinish()
renderPhotos() renderPhotos()
} }
override fun onResume() {
super.onResume()
OfflineCmdServiceHelper.addListenerSprayingFinish()
OfflineCmdServiceHelper.addOnLineListener(listener)
}
override fun onPause() {
super.onPause()
OfflineCmdServiceHelper.removeListenerSprayingFinish()
OfflineCmdServiceHelper.removeOnLineListener(listener)
}
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
binding.photo1.setImageDrawable(null) binding.photo1.setImageDrawable(null)
binding.photo2.setImageDrawable(null) binding.photo2.setImageDrawable(null)
binding.photo3.setImageDrawable(null) binding.photo3.setImageDrawable(null)
OfflineCmdServiceHelper.removeOnLineListener(listener)
OfflineCmdServiceHelper.removeAll()
} }
private fun renderPhotos() { private fun renderPhotos() {

查看文件

@ -33,15 +33,15 @@ class SprayingManualResultActivity :
} }
} }
override fun initData() { override fun onResume() {
super.initData() super.onResume()
OfflineCmdServiceHelper.addListenerSprayingManualResulth() OfflineCmdServiceHelper.addListenerSprayingManualResulth()
OfflineCmdServiceHelper.addOnLineListener(listener) OfflineCmdServiceHelper.addOnLineListener(listener)
} }
override fun onDestroy() { override fun onPause() {
super.onDestroy() super.onPause()
OfflineCmdServiceHelper.removeAll() OfflineCmdServiceHelper.removeListenerSprayingManualResulth()
OfflineCmdServiceHelper.removeOnLineListener(listener) OfflineCmdServiceHelper.removeOnLineListener(listener)
} }

查看文件

@ -116,9 +116,9 @@ class SprayingOCRActivity :
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
resultCountdown?.cancel() resultCountdown?.cancel()
OfflineCmdServiceHelper.removeListenerSprayingOCR()
OfflineCmdServiceHelper.removeOnLineListener(listener) OfflineCmdServiceHelper.removeOnLineListener(listener)
GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback) GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback)
OfflineCmdServiceHelper.removeAll()
} }
override fun onDestroy() { override fun onDestroy() {

查看文件

@ -192,8 +192,8 @@ class SprayingResultActivity :
} }
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
OfflineCmdServiceHelper.removeListenerSprayingResult()
OfflineCmdServiceHelper.removeOnLineListener(listener) OfflineCmdServiceHelper.removeOnLineListener(listener)
OfflineCmdServiceHelper.removeAll()
GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback) GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback)
} }
override fun onDestroy() { override fun onDestroy() {

查看文件

@ -179,7 +179,7 @@ class TaskListActivity :
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
OfflineCmdServiceHelper.removeAll() OfflineCmdServiceHelper.removeListenerList()
OfflineCmdServiceHelper.removeOnLineListener(offlineCmdListener) OfflineCmdServiceHelper.removeOnLineListener(offlineCmdListener)
} }