修复下载时解绑会死机的Bug
authorxue <2144439972@qq.com>
Sun, 2 Nov 2025 09:14:39 +0000 (17:14 +0800)
committerxue <2144439972@qq.com>
Sun, 2 Nov 2025 09:14:39 +0000 (17:14 +0800)
code/sdk/application/wearable/ln/nativeapp/nativeui/uiservice/src/ui_service.cpp

index 5c1a04b..79dcafe 100644 (file)
@@ -569,8 +569,44 @@ void HandBindAndUnbindNotify(Request *request)
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "HandBindAndUnbindNotify msg_id = %d", request->msgId);
     int is_bind = *(int *)request->data;
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "HandBindAndUnbindNotify is_bind = %d", is_bind);
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::ThunderBirdModel::HandleBindAndUnbind,OHOS::ThunderBirdModel::GetInstance(), is_bind));
+    
+    // 检查当前是否在 OTA slice
+    uint16_t currentSliceId = OHOS::NativeAbility::GetInstance().GetCurSliceId();
+    if (currentSliceId == VIEW_OTA) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "HandBindAndUnbindNotify: 当前在 OTA slice,退出下载并切换回 ThunderBird");
+        
+        // 停止 OTA 倒计时定时器(如果正在倒计时)
+        OHOS::OtaModel::GetInstance()->StopCountdownTimer();
+        
+        // 重置 OTA 状态
+        OHOS::ThunderBirdModel::GetInstance()->ResetOtaStatus();
+        
+        // 清空下载文件类型,防止切换到 ThunderBird 后自动恢复下载
+        OHOS::ThunderBirdModel::GetInstance()->ClearDownloadFile();
+        
+        // 切换回 ThunderBird slice
+        OHOS::NativeAbility::GetInstance().SwitchSlice(VIEW_THUNDER_BIRD);
+        
+        // 等待 slice 切换完成后再执行解绑逻辑
+        // 使用 PostGraphicEvent 确保在下一个图形事件循环中执行解绑
+        GraphicService::GetInstance()->PostGraphicEvent([is_bind]() {
+            // 再次检查是否已经切换回 ThunderBird slice
+            uint16_t sliceId = OHOS::NativeAbility::GetInstance().GetCurSliceId();
+            if (sliceId == VIEW_THUNDER_BIRD) {
+                // 执行解绑逻辑
+                OHOS::ThunderBirdModel::GetInstance()->HandleBindAndUnbind(is_bind);
+            } else {
+                // 如果还没切换完成,延迟一下再执行
+                GraphicService::GetInstance()->PostGraphicEvent([is_bind]() {
+                    OHOS::ThunderBirdModel::GetInstance()->HandleBindAndUnbind(is_bind);
+                });
+            }
+        });
+    } else {
+        // 不在 OTA slice,正常执行解绑逻辑
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::ThunderBirdModel::HandleBindAndUnbind,OHOS::ThunderBirdModel::GetInstance(), is_bind));
+    }
 }
 
 // 更新文本内容通知