iT邦幫忙

鐵人檔案

2026 iThome 鐵人賽
回列表
Software Development

從 Fragment 到 Compose — 老 Android App 重寫的架構取捨 系列

一個維護了九年的 Android 外勤 App:Java 與 Kotlin 各半、一個一萬兩千行的 Activity、沒有 DI、沒有測試。這個系列記錄我用 Jetpack Compose 多模組架構把它重寫的 30 天:每天一個真實的架構決定,寫下選項、代價與理由,並附上去識別化的程式碼。主題涵蓋 DI、狀態管理、導航、藍牙硬體抽象、離線上傳佇列,以及可跨產品覆用的 core 模組設計。

參賽天數 25 天 | 共 25 篇文章 | 1 人訂閱 訂閱系列文 RSS系列文
DAY 11

Day 11|登入畫面:第一個完整的 UiState 實作

動筆前先答(兩題) 1.【決策邊界|UI 與版型】 登入頁的手機號碼欄用系統的電話鍵盤。假設有人提議改成 App 自己畫的數字鍵盤(畫面上固定一組 0–9 的按...

2026-09-25 ‧ 由 Jim 分享
DAY 12

Day 12|公開架構模板:從私有專案抽出 core 與一個假領域 feature

動筆前先答(兩題) 1.【模擬面試追問|取捨與交付】 面試官:「你把公司專案的一部分公開成模板。如果你的主管或法務問:『你怎麼證明裡面沒有公司的東西?』你會怎麼...

2026-09-26 ‧ 由 Jim 分享
DAY 13

Day 13|多型 JSON:kotlinx.serialization 的 sealed 多型

動筆前先答(兩題) 1.【預測再驗證|網路與資料】 任務列表的每一筆是一個 JSON 物件,用 kind 欄位表示型別: @Serializable @Json...

2026-09-27 ‧ 由 Jim 分享
DAY 14

Day 14|拆一個 1,700 行的 ViewModel:`combine` 取代屏障

動筆前先答(兩題) 答完再往下讀。進文章的答案從這兩題挑;答案寫在「你的回答」下面,寫完自己 commit。 1.【預測再驗證|架構論述】 舊的任務列表把「...

2026-09-28 ‧ 由 Jim 分享
DAY 15

Day 15|拖曳排序:樂觀更新與回滾

動筆前先答(兩題) 1.【模擬面試追問|持久化與離線】 舊的排序畫面有一個開關:打開時,每放下一筆任務,就把新順序送給後端,後端會重排其他任務再回傳;等待回應的...

2026-09-29 ‧ 由 Jim 分享
DAY 16

Day 16|Use case 層要不要:排序與篩選規則該放哪裡

動筆前先答(兩題) 1.【決策邊界|架構論述】 舊的任務列表把「怎麼排序、哪些要顯示」的規則寫在一個 1,700 行的 ViewModel 裡。重寫時有三種放法...

2026-09-30 ‧ 由 Jim 分享
DAY 17

Day 17|硬體抽象:把藍牙磅秤包成 Flow

動筆前先答(兩題) 1.【模擬面試追問|平台能力】 舊 App 讀 BLE 廣播式磅秤的方式,是用 Handler 排程:開始掃描、10 秒後停止、再重新開始,...

2026-10-01 ‧ 由 Jim 分享
DAY 18

Day 18|裝置鎖定與穩定讀值:狀態機與去抖

動筆前先答(兩題) 1.【決策邊界|規格與驗收】 BLE 廣播式磅秤不需要配對,只要在範圍內,App 就收得到它的讀值。所以現場如果有兩台以上的秤,App 會同...

2026-10-02 ‧ 由 Jim 分享
DAY 19

Day 19|硬體與生命週期:掃描綁 Compose lifecycle、權限流程

動筆前先答(兩題) 1.【模擬面試追問|穩定性與記憶體】 秤重畫面這樣接磅秤的讀值: // ViewModel val reading: StateFlow&l...

2026-10-03 ‧ 由 Jim 分享
DAY 20

Day 20|CameraX 在 Compose:AndroidView 逃生門原則

動筆前先答(兩題) 1.【決策邊界|平台能力】 舊 App 有 14 個地方要拍照,全部是開系統相機(ACTION_IMAGE_CAPTURE Intent),...

2026-10-04 ‧ 由 Jim 分享