iT邦幫忙

2026 iThome 鐵人賽

DAY 19
0
Software Development

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

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

  • 分享至 

  • xImage
  •  

動筆前先答(兩題)

1.【模擬面試追問|穩定性與記憶體】 秤重畫面這樣接磅秤的讀值:

// ViewModel
val reading: StateFlow<WeightReading?> = scaleDevice.readings
    .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)

// Composable
val reading by viewModel.reading.collectAsStateWithLifecycle()

readings 是用 callbackFlow 包的 BLE 掃描:有人收集就掃描,沒人收集就停止。面試官依序問下面幾個情境,每個都要回答兩件事:掃描會不會停?如果會停,什麼時候停?

  1. 配送員把手機轉橫。
  2. 系統跳出權限對話框,蓋在秤重畫面上。
  3. 配送員拉下通知欄看了一眼。
  4. 配送員按 Home 鍵,回到桌面。
  5. 從秤重畫面進到拍照畫面,秤重畫面還留在返回堆疊裡。

接著追問:

  • 如果把 collectAsStateWithLifecycle() 換成 collectAsState(),哪幾個情境的答案會變?
  • 5_000 改成 0 呢?
  • 這 5 秒是誰的需求?如果是你,會怎麼決定這個數字?

我的回答:

  1. 我覺得掃描會停止,因為手機轉橫是手機 Config 改變。Activity 會銷毀後重建,ViewModel 也會因為附著的 Activity 銷毀而重新建立;掃描會在手機轉橫時立刻停止。
  2. 我覺得掃描會停止,因為彈窗到前景,底下頁面會進到 onStop。彈窗到前景時停止掃描。
  3. 我覺得掃描會停止,因為彈頁面會進到 onStop。拉下通知欄時停止掃描。
  4. 我覺得掃描會停止,因為 App 退到背景。按下 Home 鍵後停止掃描。
  5. 我覺得掃描會停止,因為秤重畫面退到背景。進到拍照畫面後停止掃描。

2.【預測再驗證|平台能力】 App 的 minSdk 是 26。藍牙權限的宣告方式和舊 App 一樣:

<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
    android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

磅秤只靠 BLE 廣播送出讀值,App 不和它連線。先預測下面三種情況收不收得到讀值:收得到、收不到但會報錯,還是收不到也不報錯?再查 Android 官方文件或用實機驗證。

  1. Android 13 的手機,已允許「附近的裝置」權限。
  2. Android 11 的手機,已允許位置權限,但手機的「定位」開關是關的。
  3. Android 11 的手機,位置權限被拒絕,而且勾了「不再詢問」。

最後一題:秤重畫面在開始掃描前,要檢查哪些條件?列出來,並寫出每個條件不滿足時,畫面要顯示什麼、按鈕要帶配送員去哪裡。

我的回答:
(待補充)


上一篇
Day 18|裝置鎖定與穩定讀值:狀態機與去抖
下一篇
Day 20|CameraX 在 Compose:AndroidView 逃生門原則
系列文
從 Fragment 到 Compose — 老 Android App 重寫的架構取捨 共 22 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言