Socket 客戶端實例化於登入階段,需在多個 Activity 中共用發送/接收方法。若每個 Activity 都綁定 Service 過於繁瑣,且跨進程綁定需 AIDL。
| 方案 | 優點 | 缺點 |
|---|---|---|
| 綁定服務 | 生命週期受系統管理、跨進程隔離、官方推薦 | 樣板碼多、每個 Activity 需綁定/解綁 |
| 本地服務 + 介面回呼 | 同進程、無 IPC 開銷、可單例模式持有 Socket | 進程死掉服務也會死、需處理重連 |
| Application 單例持有 Socket | 最簡單、全域存取、無綁定開銷 | 記憶體洩漏風險、進程回收時需妥善關閉、難以單元測試 |
| EventBus / LiveData + Repository | 解耦、生命週期感知、易測試 | 需引入庫、學習成本 |
SocketRepository 單例(或由 Hilt/Koin 注入),持有 Socket 連線與重連邏輯。suspend fun send(cmd)、Flow<Message> receive() 供 UI 層收集。public static SocketClient client; 會導致:多執行緒並發修改無同步、記憶體洩漏(Context 持有)、單元測試無法 Mock、進程回收後重建時狀態不一致。強烈不建議在生產專案使用。