Daily Digest

每日新聞摘要

2026年08月28日

01

Stop Hardcoding Breakpoints: A Practical Guide to WindowSizeClass in Jetpack Compose

Dev.to Kotlin 作者:YADNYESH RANA 發布:08-28 08:34

別再硬編 Breakpoint:Jetpack Compose 中 WindowSizeClass 的實用指南

你要避免的不是當機,而是五個畫面各自猜不同數字所造成的慢性漂移。

重點摘要

硬編的 dp 閾值脆弱,且容易在不同畫面間不一致
WindowSizeClass 以 COMPACT、MEDIUM、EXPANDED 提供共用分類
用單一自適應畫面搭配 slots,而不是分成手機版與平板版元件

本文指出,許多 Android 專案所謂的平板支援,其實只是把手機版介面拉寬,遇到真實平板或摺疊機就失效。作者反對以 if (screenWidthDp > 600) 這類硬編閾值判斷,改主張使用 WindowSizeClass,讓應用以 COMPACT、MEDIUM、EXPANDED 這種跨裝置的分類來決定版面。做法是先在根節點計算一次並往下傳遞,避免各畫面各自猜測。文章也提醒高度同樣重要,且 WindowSizeClass 只是基礎,無法單獨涵蓋摺疊鉸鏈、預測返回與更新的自適應 Compose API。

02

Shipping OneSignal push in a Kotlin Multiplatform app

Dev.to Kotlin 作者:Behzod Halil 發布:08-28 13:57

在 Kotlin Multiplatform App 中導入 OneSignal 推播

大部分推播實作其實與產品本身無關。

重點摘要

從直接 FCM 改為以使用者為單位的 OneSignal 尋址
以設定切換新舊管線,保留可回退的舊 FCM 路徑
先寫入持久化收件匣,再嘗試推播,讓通知成為 best-effort

StockPlus 將 Kotlin Multiplatform 的推播管線從直接使用 Firebase Cloud Messaging 轉為 OneSignal,真正的架構變化不是供應商,而是把尋址單位從裝置改成使用者。上線採用設定控制,讓舊的 FCM 路徑持續可用且預設生效。系統也採取先持久化再推播的設計:先寫入收件匣紀錄,再盡力送出通知。過程中還排查出四個安靜失敗,包括誤導性的 HTTP 成功回應、難以察覺的錯誤日誌、平台控制流問題,以及 Firebase 依賴衝突導致 Android 無法正常訂閱。

03

Implementing an Update Queue: Recovering Missed Updates After a Socket Reconnect

Medium Kotlin 作者:MohammadrezaAbbaszadeh 發布:08-28 12:27

實作更新佇列:在 Socket 重新連線後補回遺失的更新

我們如何為訊息用戶端建立可靠的更新同步機制——以及兩個比設計文件更有教訓價值的 bug。

重點摘要

為訊息用戶端建立可靠的更新同步
以更新佇列在重新連線後補回遺失資料
兩個 bug 帶來了比設計文件更深的實作教訓

本文說明團隊如何為訊息用戶端建立可靠的更新同步機制,重點是當 Socket 斷線並重新連線後,如何補回期間遺失的更新。作者透過更新佇列讓客戶端在連線恢復時能追上進度,避免資料不一致。實作過程中遇到的兩個 bug,也揭示了設計文件未完全涵蓋的實務問題,並促使團隊修正架構與流程,進一步強化系統在真實環境中的穩定性。

04

Kotlin Variance: The in and out Keywords, Demystified

Medium Kotlin 作者:Wagner Franchin 發布:08-28 12:28

Kotlin 變異:深入淺出 in 與 out 關鍵字

為什麼 `List<Cat>` 不能放在需要 `List<Animal>` 的地方,以及解決它的兩個小關鍵字

重點摘要

說明 Kotlin 中泛型型別為何不能任意互換。
介紹 `in` 與 `out` 作為變異的核心工具。
展示變異如何讓 API 在保持型別安全下更彈性。

本文說明 Kotlin 的變異(variance)概念,以及 `in`、`out` 兩個關鍵字在泛型型別安全中的作用。文章從常見情境切入:即使 Cat 是 Animal 的子型別,`List<Cat>` 仍不能直接當成 `List<Animal>` 使用。接著介紹 Kotlin 以宣告處變異來表達型別參數的角色:`out` 偏向產出者,`in` 偏向消費者。透過這套機制,Kotlin 能在不犧牲型別安全的前提下,讓泛型 API 更具彈性。

05

Engineering Geofencing: The Battery-Accuracy Tradeoff in Android

Dev.to Kotlin 作者:Haseeb 發布:08-27 23:16

Android 地理圍欄工程:電量與精準度的取捨

在 Android 上打造地理圍欄,是一場充滿取捨的工程。

重點摘要

高精準度定位可能耗電,且不一定能即時觸發。
以 GeofencingClient 搭配 PendingIntent 與 BroadcastReceiver,可降低背景耗能。
加入狀態緩衝與 ForegroundService,能提升跨裝置穩定性。

這篇文章分享作者為 Muffle 打造 Android 自動化靜音功能的經驗,核心難題是地理圍欄在精準度與電量之間的取捨。作者發現,Android 的 GeofencingClient 雖然是官方方案,但在省電模式或裝置靜止時,觸發可能延遲,甚至被系統抑制。若改用高頻率定位雖然更準,卻會造成嚴重耗電,因此最後採用 GeofencingClient 搭配 PendingIntent 與 BroadcastReceiver,並用時間門檻過濾進出邊界的抖動。面對部分裝置會終止背景程序,作者改以 ForegroundService 與持續通知提高優先權,也強調應建立完善日誌,並接受平台限制,才能做出穩定可靠的背景自動化。

06

How I built a floating dictation orb on Android, and why the accessibility service is the whole app

Dev.to Kotlin 作者:Ayanda Phaketsi 發布:08-28 03:57

我如何在 Android 上打造浮動聽寫球,以及為何無障礙服務就是整個 App

真正有趣的部分不是轉錄,而是要知道它何時該出現。

重點摘要

用 AccessibilityService 判斷目前是否有可編輯輸入欄位取得焦點。
浮動覆蓋層必須保持不搶焦點,否則游標會消失。
採串流聽寫與完整音檔備援,降低體感延遲並避免資料遺失。

作者打造了 RMBLR 這款 Android 浮動聽寫球,目的是處理英語與母語混雜的口說內容,因為多數聽寫工具會先選定單一語言而導致結果需要重打。文章指出,關鍵不在轉錄本身,而在於何時顯示:Android 只能靠 AccessibilityService 判斷外部 App 的輸入欄位是否取得焦點。為避免覆蓋層搶走游標,介面必須維持不可聚焦,並以貼上優先、失敗才改用設定文字。作者也透過串流上傳音訊降低體感延遲,並保留完整 WAV 作為網路不穩時的備援。

07

20/28: What Actually Happens When You Call requestPermissions()

Medium Kotlin 作者:Pramod Patel 發布:08-28 00:31

20/28:呼叫 requestPermissions() 時實際會發生什麼事

PermissionController、授權與 AppOps

重點摘要

說明 requestPermissions() 背後的內部流程。
介紹 PermissionController 如何處理權限授予。
提及 AppOps 在權限管理中的角色。

這篇文章看起來是在說明 Android 中應用程式呼叫 requestPermissions() 時,系統內部實際會發生的流程。依據目前可取得的內容,重點放在 PermissionController、權限授予機制,以及 AppOps 在權限檢查與執行中的作用。這是系列文章的一部分,目的在於拆解這個看似簡單的 API 呼叫背後的系統層步驟。

08

Mastering Jetpack Compose Side Effect States

Medium Kotlin 作者:Arun Gohil 發布:08-28 04:31

掌握 Jetpack Compose 的 Side Effect 狀態

在本系列的前一部分中,我們介紹了 LaunchedEffect、rememberCoroutineScope 與 DisposableEffect 等 Side-Effect 處理器。

重點摘要

延續 Jetpack Compose side effect 系列內容
回顧前文提到的幾個關鍵處理器
引出下一個主題:side effect 狀態

這篇文章是 Jetpack Compose 系列的延續,承接前一部分對 Side-Effect Handlers 的介紹,包含 LaunchedEffect、rememberCoroutineScope 與 DisposableEffect。從目前提供的內容可知,本文將進一步談論 side-effect states,並延伸前文對 Compose 副作用機制的討論。