修复主界面卡片无法回到主界面的bug 2198/1 2198/head
authorCaisking <Casiking@zhihuishixun.com>
Tue, 2 Sep 2025 09:21:52 +0000 (17:21 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Tue, 2 Sep 2025 09:21:52 +0000 (17:21 +0800)
code/sdk/application/wearable/fd230/nativeabilityfwk/include/Ability.h
code/sdk/application/wearable/fd230/nativeabilityfwk/src/Ability.cpp
code/sdk/application/wearable/fd230/nativeabilityfwk/src/NativeAbility.cpp

index 876c5b0..bd82b42 100644 (file)
@@ -108,9 +108,21 @@ public:
     uint16_t GetPreSliceId(void)
     {
         if (allSlices_.Size() < 2) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] GetPreSliceId - allSlices_ size < 2 (%d), returning invalid", allSlices_.Size());
             return gSliceInvalid;
         }
-        return static_cast<uint16_t>(allSlices_[allSlices_.Size() - 2] & SLICE_MASK);
+        uint16_t preSliceId = static_cast<uint16_t>(allSlices_[allSlices_.Size() - 2] & SLICE_MASK);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] GetPreSliceId - allSlices_ size: %d, preSliceId: %d", allSlices_.Size(), preSliceId);
+        
+        // 打印 allSlices_ 的完整内容用于调试
+        // printf("[DEBUG] allSlices_ content: [");
+        // for (int i = 0; i < allSlices_.Size(); i++) {
+        //     printf("%d", allSlices_[i] & SLICE_MASK);
+        //     if (i < allSlices_.Size() - 1) printf(", ");
+        // }
+        // printf("]\n");
+        
+        return preSliceId;
     }
 
     void UpdateCurSlicePageId(uint16_t pageId);
index 9c21116..7286fed 100644 (file)
@@ -62,12 +62,32 @@ void Ability::StartSlice(uint32_t targetId)
     }
 
     if (sliceId == defaultTargetId_) {
-        allSlices_.Clear(); // clear slice history when return to main slice
-        allSlices_.PushBack(defaultTargetId_);
+        // 只有在 allSlices_ 为空时才清空,否则保持历史记录
+        if (allSlices_.IsEmpty()) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] StartSlice - Returning to MAIN slice, allSlices_ is empty, adding main slice");
+            allSlices_.PushBack(defaultTargetId_);
+        } else {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] StartSlice - Returning to MAIN slice, preserving history, size: %d", allSlices_.Size());
+            // 如果栈顶不是主界面,则添加主界面
+            if ((allSlices_[allSlices_.Size() - 1] & SLICE_MASK) != defaultTargetId_) {
+                allSlices_.PushBack(defaultTargetId_);
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] StartSlice - Added main slice to stack, new size: %d", allSlices_.Size());
+            }
+        }
     } else if (PageTransitionMgr::GetInstance().IsBackTransitionRunning()) {
+        WEARABLE_LOGE
+        (WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] StartSlice - Back transition running, popping from allSlices_, size before: %d", allSlices_.Size());
         allSlices_.PopBack();
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] StartSlice - allSlices_ size after pop: %d", allSlices_.Size());
     } else {
-        allSlices_.PushBack(targetId);
+        // 检查是否已经在栈顶,避免重复添加相同的界面
+        if (allSlices_.IsEmpty() || (allSlices_[allSlices_.Size() - 1] & SLICE_MASK) != sliceId) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] StartSlice - Adding new slice %d to allSlices_, size before: %d", targetId, allSlices_.Size());
+            allSlices_.PushBack(targetId);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] StartSlice - allSlices_ size after push: %d", allSlices_.Size());
+        } else {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] StartSlice - Slice %d already on top, not adding again, size: %d", sliceId, allSlices_.Size());
+        }
     }
 
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability StartSlice %d page %d size:%d", sliceId,
index b885efe..0f62c48 100644 (file)
@@ -91,9 +91,19 @@ void NativeAbility::ResumeAbility(uint32_t targetId)
     GraphicService::GetInstance()->SetNativeUIRunning(true);
     NotificationManager::GetInstance()->SetNativeUIRunning(true);
     if ((targetId & SLICE_MASK) != VIEW_AOD) {
-        allSlices_.Clear(); // clear slice history when jump from js to native
+        // 只有在 allSlices_ 为空或者当前目标不是主界面时才清空
+        // 这样可以保持界面导航历史的完整性
+        if (allSlices_.IsEmpty() || (targetId & SLICE_MASK) != defaultTargetId_) {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] ResumeAbility - Jumping from JS to native, clearing allSlices_, size before: %d", allSlices_.Size());
+            allSlices_.Clear(); // clear slice history when jump from js to native
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] ResumeAbility - allSlices_ cleared, size after: %d", allSlices_.Size());
+        } else {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] ResumeAbility - Preserving allSlices_ history, size: %d", allSlices_.Size());
+        }
     } else {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] ResumeAbility - AOD slice, popping from allSlices_, size before: %d", allSlices_.Size());
         allSlices_.PopBack(); // clear invalid slice id
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] ResumeAbility - allSlices_ popped, size after: %d", allSlices_.Size());
     }
     StartSlice(targetId);
     if (nextSlice_.slice == nullptr) {