### WorkManager 是什麼、適用場景 * WorkManager 是 Jetpack 套件的一部分,用於可靠執行背景任務 * 即使 App 關閉或裝置重新啟動,已排程的任務仍會被執行 * 適合用於需要保證完成的工作,例如資料備份、檔案上傳/下載、定期同步 * 支援一次性任務(One-Time Work)與週期性任務(Periodic Work) --- ### 任務類型與用途 * Immediate:立即執行,短時間完成 * Long running:長時間任務,如大型檔案下載 * Deferrable:延後執行,依條件排程 * 可設定條件(Constraints)如:需有網路、裝置充電中等 --- ### 示範 App 實作內容概述 * 按下「Start Download」後下載圖片並套用顏色濾鏡 * 下載與濾鏡處理為兩個串接的 Worker 任務 * 即使關閉 App,任務也會繼續執行並最終更新 UI --- ### 使用 Retrofit 建立 API   * 使用 Retrofit 下載圖片(response body 為 stream) * 不使用 JSON,只需提供 base URL 與下載端點 * 將 API 實例設為 singleton 以簡化使用 --- ### 建立 Worker 類別  * Worker 定義具體的背景任務內容 * 使用 CoroutineWorker 搭配 suspend function 處理非同步 * 傳回 Result.success、Result.failure、Result.retry 控制任務結束狀態 --- ### 顯示通知與使用前景執行(Foreground) * 若任務長時間執行,可透過 Foreground Service 顯示持續通知 * WorkManager 提供內建方式啟用 Foreground 模式與通知 * 須先建立通知頻道(Notification Channel) --- ### 建立 Application 類別註冊通知頻道  * 在 Application.onCreate() 中建立通知頻道 * 僅在 Android Oreo(API 26) 以上版本需要設定 * 設定 Channel ID、名稱、重要性等參數 * 在 AndroidManifest.xml 中註冊 Application 類別 --- ### WorkManager 執行可靠性機制 * 任務資訊儲存在資料庫中,裝置重啟後仍可恢復 * 可設定失敗重試(如伺服器錯誤回傳 HTTP 5xx) * 任務執行時不依賴 App 是否開啟 --- ### 任務排程與資料傳遞 * 可將一個 Worker 的輸出結果作為下一個 Worker 的輸入 * 支援 chaining:順序執行多個 Worker * 任務啟動時可指定輸入資料(如檔案路徑) --- ### 網路條件限制與 Work Constraints * 可設定任務僅在有網路時執行 * 如果條件不符合,WorkManager 會延遲執行直到條件滿足 * 避免在不適合的環境中執行耗資源的任務(如無網路) --- ### 預備與依賴設定 * 加入 WorkManager、Coroutines、Retrofit、Coil 等必要依賴 * Compose 搭配 ViewModel 與 LiveData 以觀察任務進度與狀態 * UI 使用 Jetpack Compose,圖片儲存在內部儲存空間中展示處理結果 --- ### 建立通知並啟動 Foreground 執行 * 建立 `showNotification` 函式,實際上命名應改為 `startForegroundService` * 使用 `setForeground()` 指定 Foreground 任務所需的 `ForegroundInfo` * 通知內容透過 `NotificationCompat.Builder` 建立,指定 channel ID、圖示、標題與描述文字 * 可使用 `launcher_icon` 作為預設圖示 --- ### 檔案下載邏輯與儲存流程 * 使用 Retrofit 呼叫 API 下載圖片,回傳 `ResponseBody` * 檢查回傳是否為 null,若非 null 代表下載成功 * 在 `Dispatchers.IO` 上下文中處理 I/O 寫入邏輯 * 圖片儲存位置使用 `cacheDir` 目錄,檔名為 `image.jpg` * 使用 `FileOutputStream` 將位元組資料寫入檔案 --- ### 錯誤處理與回傳結果設計 * 使用 `try-catch` 捕捉 I/O 例外,發生錯誤時回傳 `Result.failure()` * 錯誤資料以 `WorkData.of(...)` 包裝,傳入錯誤訊息 * 成功時以 `Result.success()` 回傳,並附上圖片路徑作為字串型 URI * 所有輸出資料都以字串儲存,方便跨 Worker 傳遞 --- ### HTTP Response 狀態處理策略 * 若回應代碼為 5xx,代表伺服器錯誤,回傳 `Result.retry()` * 若為 4xx/3xx,屬用戶端錯誤,回傳 `Result.failure()` 並記錄錯誤訊息 * 若無法辨識錯誤原因,統一回傳 `unknown error` --- ### 色彩濾鏡 Worker:基本設置與輸入資料處理  * 新增 `ColorFilterWorker`,繼承 `CoroutineWorker` 並實作 `doWork()` * 從 `inputData` 取得 `imageUri`,轉換為 File 實體 * 若輸入為 null,立即回傳 `Result.failure()` --- ### 色彩處理邏輯與儲存結果 * 使用 `BitmapFactory.decodeFile()` 讀取圖片成為 `Bitmap` * 建立新 `Bitmap` 副本並套用綠色濾鏡(使用 `LightingColorFilter`) * 使用 `Canvas` 將濾鏡應用於 `Bitmap` * 儲存位置同樣為 `cacheDir`,檔名為 `new_image.jpg` * 透過 `bitmap.compress()` 將處理後圖檔寫入檔案 * 成功時回傳包含濾鏡圖片 URI 的 `Result.success()`,失敗則回傳 `Result.failure()` --- ### 串接多個 Worker(準備) * 設定第一個 Worker(下載)完成後,將結果傳遞給第二個 Worker(濾鏡處理) * 第二個 Worker 從 `inputData` 中接收前一個任務的輸出 URI * 完整串接流程後續會處理,確保任務能順序執行並接收輸出 --- ### 設計細節與實務注意事項 * 使用 `WorkData` 傳遞字串形式的 URI,而非直接傳遞 URI 實體 * 所有 File 操作使用內部儲存空間避免權限問題 * 延遲處理 (`delay(5000)`) 只為展示效果,實務可移除 * 錯誤與例外處理策略可自訂,視實際產品需求調整 --- ### 建立 WorkRequest * 使用 `OneTimeWorkRequestBuilder` 建立單次任務;若要週期性任務則改用 `PeriodicWorkRequestBuilder`。 * 指定 Worker 類型(如 `DownloadWorker`、`ColorFilterWorker`),無需重複間隔參數。 * 透過 `build()` 生成 `WorkRequest` 後便可傳遞給 WorkManager。 ### 設定工作約束(Constraints) * 以 `Constraints.Builder` 設定執行條件,例如 `setRequiredNetworkType(NetworkType.CONNECTED)` 只在有網路時下載。 * 其他常用條件:`setRequiresCharging(true)`、`setRequiresBatteryNotLow(true)`、`setStorageNotLow(true)`。 * 建立完成後於 `WorkRequest` 上呼叫 `.setConstraints()`。 ### 唯一工作與 ExistingWorkPolicy * 透過 `beginUniqueWork()` 指定唯一工作名稱(如 `"download"`),避免同類任務重複併發。 * `ExistingWorkPolicy.KEEP`:若已有執行中的同名工作,忽略新請求。 * 其他策略:`REPLACE` 取代舊工作;`APPEND` 將新工作排在舊工作之後。 ### 鏈結多個 Worker * 使用 `then(colorFilterRequest)` 將第二個 `WorkRequest` 接在第一個後方順序執行。 * 最後呼叫 `enqueue()` 實際排程整串任務。 * 第一個 Worker 成功結束後,其輸出可做為下一個 Worker 的 `inputData`。 ### 監聽 WorkInfo 狀態 * 以 `workManager.getWorkInfosForUniqueWorkLiveData("download")` 取得 LiveData 列表。 * 在 Compose 中使用 `observeAsState()` 將 LiveData 轉換為 State 物件。 * 透過 `workInfos.find { it.id == request.id }` 取得指定工作資訊。 ### 讀取輸入/輸出資料 * 成功完成時於 Worker 回傳 `Result.success(workDataOf(KEY to value))`。 * 在下一個 Worker 透過 `inputData.getString(KEY)` 取得前一工作輸出。 * 在 UI 端可讀取 `workInfo.outputData` 顯示下載圖片或錯誤訊息。 ### Compose UI 控制邏輯 * 按鈕 `enabled` 狀態依 `workInfo.state != State.RUNNING` 決定,避免重複觸發。 * 透過 `rememberImagePainter(uri)` 顯示下載後或濾鏡處理後的圖片。 * 使用 `derivedStateOf` 動態選擇要顯示的 URI(濾鏡圖優先,其次原始圖)。 ### WorkInfo State 與畫面提示 * `RUNNING`:顯示「Downloading / Applying filter」。 * `SUCCEEDED`:顯示「Download succeeded / Filter succeeded」。 * `FAILED`:顯示「Download failed / Filter failed」。 * `ENQUEUED`:尚未開始執行,提示「Work enqueued」。 * `BLOCKED`:受條件限制暫未執行,提示「Download blocked / Filter blocked」。 ### 其他實務注意事項 * 可透過 `setInitialDelay()` 延遲任務起跑,或 `setBackoffCriteria()` 自訂重試機制。 * `cancelWorkById()`、`cancelAllWorkByTag()` 用於手動取消排程。 * 若需要傳遞大量資料,建議以檔案路徑/URI 方式而非直接置於 `WorkData`。 --- # 選擇題 1. WorkManager 主要用途是? A. 執行 UI 更新 B. 處理短暫動畫 C. 處理需可靠執行的背景工作 D. 儲存暫存檔案 **答案:C** 2. WorkManager 最適合用於哪種情境? A. 動畫播放 B. 使用者互動立即反應 C. 裝置重啟後仍需執行的工作 D. 實作 Compose 畫面 **答案:C** 3. 下列哪一個是 WorkManager 支援的工作類型? A. HTTP 請求 UI Thread 執行 B. Deferred tasks C. Broadcast 接收器 D. ContentProvider 操作 **答案:B** 4. 使用 WorkManager 的主要優勢是? A. 支援 XML 資料綁定 B. 不需執行緒處理 C. 即使裝置重開機也可保留任務 D. 可直接存取 Activity **答案:C** 5. 若想建立會重複執行的工作,應使用? A. OneTimeWorkRequest B. PeriodicWorkRequest C. RepeatingService D. CoroutineScope **答案:B** 6. WorkManager 預設使用什麼儲存工作資訊? A. SharedPreferences B. File C. SQLite D. MemoryCache **答案:C** 7. 若需建立 WorkManager 任務,需繼承哪個類別? A. AsyncTask B. Service C. Worker 或 CoroutineWorker D. BroadcastReceiver **答案:C** 8. 若想傳入參數至 Worker 中,應使用? A. Intent B. Bundle C. Data D. Arguments **答案:C** 9. 若想從 Worker 回傳結果,應使用哪個類型? A. Result.SUCCESS B. Boolean C. Int D. Response **答案:A** 10. 若希望任務失敗後重新嘗試,Worker 回傳應為? A. Result.success() B. Result.failure() C. Result.retry() D. Result.cancelled() **答案:C** 11. 若需設定任務僅在裝置充電時執行,應使用? A. Constraints.Builder B. RetryPolicy C. AlarmManager D. BroadcastReceiver **答案:A** 12. Constraints 中,無法設定哪一種條件? A. 網路狀態 B. 電池狀態 C. 地理位置 D. 是否充電 **答案:C** 13. WorkManager 中傳遞輸出資料使用? A. OutputData B. Result.setData() C. setOutputData() D. Intent.putExtra() **答案:C** 14. 若要連接多個 Worker 的執行順序,應使用? A. WorkManager.enqueue() B. WorkContinuation C. Service.start() D. Handler.post() **答案:B** 15. 如何在應用程式中啟動 WorkManager? A. callWorker() B. startService() C. WorkManager.getInstance().enqueue() D. IntentService.enqueueWork() **答案:C** 16. 在 Worker 中若發生例外,預設行為是? A. 自動重新啟動 B. 回傳 Result.failure() C. 應用程式崩潰 D. 忽略錯誤繼續執行 **答案:B** 17. 若任務需要即時執行,應使用? A. JobScheduler B. CoroutineScope C. OneTimeWorkRequest D. IntentService **答案:C** 18. 若需在任務執行期間顯示通知,應使用? A. ForegroundInfo B. IntentService C. AlertDialog D. NotificationCompat.setAutoCancel **答案:A** 19. 在 Android 8.0+ 使用 Foreground Service 時需? A. 註冊 BroadcastReceiver B. 加入通知渠道 C. 開啟新 Activity D. 寫入文件系統 **答案:B** 20. 若想使用協程簡化 Worker 撰寫,應繼承? A. Worker B. CoroutineWorker C. AsyncWorker D. ServiceWorker **答案:B** 21. 若需同時執行多個 Worker,應使用? A. CoroutineScope B. WorkContinuation.combine() C. AsyncTask D. JobScheduler **答案:B** 22. Data 類別支援哪種資料型態? A. 自訂類別 B. 檔案路徑 C. 基本型別與其陣列 D. Parcel **答案:C** 23. 若任務在裝置未連網時啟動但需網路,WorkManager 行為為? A. 立即失敗 B. 延遲執行至有網路 C. 強制執行 D. 自動取消 **答案:B** 24. WorkManager 支援的最小執行週期為? A. 10 分鐘 B. 15 分鐘 C. 30 分鐘 D. 1 小時 **答案:B** 25. 若想停止一個排程中的 Worker,應呼叫? A. stopWorker() B. WorkManager.cancelWorkById() C. Job.stop() D. Context.stopService() **答案:B** 26. Worker 的輸入資料取得方式為? A. getIntent() B. getInputData() C. extras D. parameters.get() **答案:B** 27. 如果多個任務之間要傳遞資料,應使用? A. Notification B. Bundle C. Output/Input Data D. Intent **答案:C** 28. 建立 WorkManager 任務時,需呼叫哪個建構器? A. WorkerBuilder B. TaskBuilder C. OneTimeWorkRequest.Builder D. WorkerFactory **答案:C** 29. 若任務應每隔一段時間執行一次,應使用? A. Service B. PeriodicWorkRequest C. LiveData D. AlarmManager **答案:B** 30. 若要觀察任務執行狀態,應使用? A. LiveData`<WorkInfo>` B. BroadcastReceiver C. CoroutineScope D. Intent.getExtras() **答案:A** 1. 下列哪個方法可讓 Worker 執行時顯示通知? A. setNotification() B. setForeground() C. startForegroundService() D. notifyUser() **答案:B** 2. `setForeground()` 需要傳入哪個物件? A. Intent B. ForegroundService C. ForegroundInfo D. NotificationManager **答案:C** 3. ForegroundInfo 中必須包含? A. Service 類別 B. Job ID C. Notification ID 與 Notification D. IntentFilter **答案:C** 4. NotificationCompat.Builder 建立通知時必需指定? A. MainActivity B. Service 類別 C. Context 與 Channel ID D. WorkManager 執行序 **答案:C** 5. 若要避免主執行緒操作磁碟,應將儲存檔案邏輯放入? A. Thread.sleep() B. Dispatchers.Main C. withContext(Dispatchers.IO) D. GlobalScope.launch **答案:C** 6. 要將 Retrofit Response 存成檔案,需取得哪個物件? A. Response.body() B. Response.headers C. Response.code() D. Response.uri() **答案:A** 7. 存檔時使用哪個類別建立輸出流? A. InputStream B. FileWriter C. OutputStreamWriter D. FileOutputStream **答案:D** 8. 使用 FileOutputStream 時建議使用哪個區塊確保關閉? A. try-with-resources B. try-finally C. use{} D. close() **答案:C** 9. 若 Retrofit 回傳錯誤應回傳什麼? A. Result.retry() B. Result.success() C. Result.failure() D. Result.error() **答案:C** 10. 若為 5xx 錯誤,適合回傳? A. Result.retry() B. Result.failure() C. Result.cancelled() D. Result.pending() **答案:A** 11. WorkData 是用來? A. 操作 UI 元件 B. 傳遞 Intent C. 傳遞 Worker 的輸入輸出參數 D. 控制 Worker 執行順序 **答案:C** 12. WorkData 只接受哪些資料型別? A. Serializable B. Uri C. 基本型別與字串 D. Bitmap **答案:C** 13. 儲存檔案時的建議路徑為? A. /storage/emulated/0/ B. Environment.getExternalStorageDirectory() C. context.cacheDir D. /sdcard/ **答案:C** 14. 若要傳遞 Uri 至下一個 Worker,應轉為? A. Int B. String C. Bundle D. Boolean **答案:B** 15. 若 Response.body() 為 null,應回傳? A. Result.success() B. Result.cancelled() C. Result.failure() D. Result.blocked() **答案:C** 16. 若要在 Worker 執行時延遲 5 秒,應使用? A. Thread.sleep() B. delay(5000) C. wait(5000) D. Handler.postDelayed **答案:B** 17. 使用哪個類別可解析檔案為 Bitmap? A. BitmapReader B. ImageFactory C. BitmapFactory D. UriParser **答案:C** 18. 若要修改 Bitmap 需使用? A. Immutable copy B. Mutable copy C. cloneBitmap() D. Resample **答案:B** 19. 若要套用顏色濾鏡應使用? A. Paint.color B. LightingColorFilter C. ColorMatrix D. ImageFilter **答案:B** 20. 繪製 Bitmap 到 Canvas 可使用? A. canvas.drawPath() B. canvas.setBitmap() C. canvas.drawBitmap() D. canvas.applyPaint() **答案:C** 21. 將 Bitmap 寫回檔案應使用哪個方法? A. writeBitmap() B. compress() C. flush() D. encode() **答案:B** 22. compress() 需指定哪三個參數? A. 格式、路徑、context B. 格式、品質、OutputStream C. MIME 類型、URI、檔案名 D. 寬度、高度、品質 **答案:B** 23. 若儲存成功,回傳? A. Result.success() B. Result.failure() C. Result.retry() D. Result.completed() **答案:A** 24. 要將兩個 Worker 串接應使用? A. WorkManager.enqueue() B. WorkContinuation.then() C. startNextWorker() D. chainWorkers() **答案:B** 25. 若從輸入資料取得字串應使用? A. inputData.getUri() B. inputData.get("uri") C. inputData.getString() D. inputData.fetch() **答案:C** 26. 若要將檔案路徑轉為 Uri,應使用? A. Uri.fromFile() B. file.toPath() C. File.getUri() D. toUriString() **答案:A** 27. 在 Worker 內存取 context 可直接使用? A. this.applicationContext B. getApplicationContext() C. context D. requireContext() **答案:C** 28. 若要傳遞錯誤訊息至 UI 可使用? A. Toast B. LiveData C. WorkData 的 error message key D. Intent.putExtra **答案:C** 29. Worker 失敗後是否能傳遞資料? A. 否 B. 是,透過 output Data C. 僅限成功狀態 D. 僅限 retry 狀態 **答案:B** 30. 若第二個 Worker 接收不到輸入資料,會發生? A. 跳過執行 B. 發生例外錯誤 C. 傳回 Result.failure() D. 重新嘗試 **答案:C** 1. 建立單次執行的 WorkRequest 應使用哪個類別? A. PeriodicWorkRequest B. OneTimeWorkRequestBuilder C. SingleWorkBuilder D. WorkScheduleRequest **答案:B** 2. 若要排程週期性工作,應使用? A. RepeatedWorkManager B. PeriodicWorkRequestBuilder C. OneTimeWorkRequest D. WorkerLooper **答案:B** 3. 下列哪個方法可設定網路需求? A. setNetworkRequired() B. setNetworkConstraint() C. setRequiredNetworkType() D. requireWifi() **答案:C** 4. `NetworkType.CONNECTED` 意思是? A. 僅限 WiFi B. 僅限行動數據 C. 任何網路連線即可 D. 離線模式執行 **答案:C** 5. 若希望只有在充電時才執行工作,應使用哪個設定? A. setRequiresCharging(true) B. requireCharging() C. enableChargingOnly() D. setBatterySaverMode() **答案:A** 6. 哪個設定會延遲任務開始? A. setDelayStart() B. setWaitTime() C. setInitialDelay() D. setDeferTime() **答案:C** 7. 哪個屬性可定義重試策略? A. retryBackoff() B. setBackoffCriteria() C. retryPolicy() D. setRetryInterval() **答案:B** 8. 要取得 WorkManager 實例,應呼叫? A. WorkManager.create() B. WorkManager.newInstance() C. WorkManager.getInstance(context) D. WorkManager.init(context) **答案:C** 9. 若要觀察任務狀態變化,應使用? A. getLiveData() B. getWorkState() C. getWorkInfosLiveData() D. getWorkerStatus() **答案:C** 10. 取得 WorkInfo 列表後要找出特定任務,應根據什麼欄位? A. tag B. id C. name D. type **答案:B** 11. 若想限制同時只允許一個任務執行,應使用? A. WorkManager.schedule() B. enqueueUniqueWork() C. enqueueSerialWork() D. executeOneAtATime() **答案:B** 12. enqueueUniqueWork 時需指定的政策為? A. ExistingWorkPolicy B. ConflictStrategy C. RetryPolicy D. ReplacePolicy **答案:A** 13. ExistingWorkPolicy.KEEP 的意思是? A. 移除舊任務 B. 保留舊任務,忽略新任務 C. 併行執行兩任務 D. 全部取消 **答案:B** 14. 若需串接兩個工作,應使用? A. chainWorkers() B. then() C. setNext() D. sequence() **答案:B** 15. 若使用 LiveData 配合 Compose,需轉換為? A. StateFlow B. observeAsState() C. rememberLiveData() D. collectAsState() **答案:B** 16. 用 `inputData` 傳遞資料時可使用哪個方法? A. setExtras() B. putExtra() C. setInputData() D. appendData() **答案:C** 17. 使用 `outputData` 時應在 Worker 中回傳? A. Result.success(outputData) B. Data.success(output) C. OutputData.send() D. Result.data(output) **答案:A** 18. 若要從 WorkInfo 取出資料,應使用? A. info.get("key") B. info.inputData.get() C. info.outputData.getString("key") D. info.result() **答案:C** 19. 若要在 Compose 顯示圖片並支援 URI,需使用? A. ImageBitmap B. GlideView C. rememberImagePainter D. FileImageView **答案:C** 20. 若要避免重複觸發下載,按鈕應於何種狀態禁用? A. ENQUEUED B. SUCCEEDED C. RUNNING D. CANCELLED **答案:C** 21. `WorkInfo.State.BLOCKED` 的意思是? A. 下載錯誤 B. 任務等待條件滿足 C. 任務已完成 D. 任務取消 **答案:B** 22. 若任務完成,狀態為? A. CANCELLED B. ENQUEUED C. SUCCEEDED D. FAILED **答案:C** 23. 若任務未成功且不應重試,狀態為? A. FAILED B. BLOCKED C. CANCELLED D. COMPLETED **答案:A** 24. 若任務被使用者或系統終止,狀態為? A. ENDED B. FAILED C. CANCELLED D. STOPPED **答案:C** 25. 使用 WorkManager 可在應用程式未啟動時執行任務嗎? A. 否 B. 僅限前景服務 C. 是 D. 僅限螢幕開啟時 **答案:C** 26. 若使用者重新開機設備,WorkManager 任務會? A. 失效 B. 重新下載 C. 自動重排程 D. 被清除 **答案:C** 27. 若使用 wrong constraint,導致任務不會啟動,狀態會是? A. FAILED B. BLOCKED C. WAITING D. INVALID **答案:B** 28. 若需要連接網路與充電才能執行,應設定? A. 多個 WorkRequest B. 多個 constraint C. 多個 WorkPolicy D. 多個 InputData **答案:B** 29. 要取消指定任務,可使用? A. cancelAllWork() B. cancelWorkById() C. cancelTask() D. stopWorker() **答案:B** 30. 下列哪個條件會觸發 BACKOFF 重試策略? A. 工作未執行 B. 工作被取消 C. 工作回傳 retry() D. 輸出資料為空 **答案:C** --- # Terminology * WorkManager:Jetpack 元件,用於執行可靠的背景工作,即使應用關閉或裝置重新啟動也能保證執行。 * CoroutineWorker:使用協程實作的 Worker,可在 suspending 函式中執行非同步任務。 * Worker:代表一個可排程的單一背景工作任務,需繼承並實作 `doWork()`。 * OneTimeWorkRequest:建立只執行一次的 WorkManager 任務。 * PeriodicWorkRequest:建立重複執行的 WorkManager 任務,必須至少每 15 分鐘一次。 * Constraints:限制條件,指定工作執行前需滿足的條件(如網路、電量等)。 * WorkRequest:WorkManager 任務的抽象型別,可是一次性或週期性。 * WorkManager.enqueue():提交任務給 WorkManager 進行排程。 * WorkContinuation:允許你將多個工作串接(Chaining)起來執行。 * Data:可傳遞至 Worker 的鍵值對資料容器。 * Result.success():工作成功執行並完成。 * Result.retry():工作失敗但應重試。 * Result.failure():工作失敗且不應再重試。 * InputData:傳遞給 Worker 的資料,用於初始化任務。 * OutputData:Worker 輸出的資料,可傳遞給下一個 Worker。 * WorkManager.getInstance():取得 WorkManager 實例。 * WorkInfo:工作資訊,包含當前狀態、輸出資料等。 * WorkInfo.State:工作狀態列舉,如 ENQUEUED、RUNNING、SUCCEEDED。 * LiveData:Android 架構元件,用於監聽資料變化並更新 UI。 * CoroutineScope:定義協程生命週期範圍,用以避免資源洩漏。 * suspend function:可暫停與恢復執行的函式,常用於非同步操作。 * Application 類別:應用的全域初始化類別,常用來設定通知頻道。 * NotificationChannel:Android 8 以上建立通知所需的通道。 * NotificationManager:系統服務,用來發送與管理通知。 * Context.getSystemService():取得系統服務,如通知或連線狀態。 * NotificationCompat.Builder:用於建立向後相容的通知。 * Foreground Service:具通知顯示的服務,用於需要長時間執行的背景任務。 * WorkManager.setForegroundAsync():設定 Worker 於前景模式執行。 * Channel ID:通知通道的唯一識別字串。 * Importance.HIGH:高優先權通知,會發出聲音與顯示通知橫幅。 * Retrofit:HTTP 用戶端,用於網路請求與資料下載。 * ResponseBody:Retrofit 的回應物件,可轉為 byte stream。 * Base URL:Retrofit 使用的基礎網址。 * Coil:影像載入函式庫,用於 Jetpack Compose 中顯示圖片。 * Modifier.fillMaxSize():Compose 中的修飾符,用以填滿可用空間。 * Button(onClick):Compose 按鈕元件與點擊事件。 * Lazy initialization:僅在首次使用時初始化變數,提升效能。 * ImageRequest:Coil 的請求物件,用於載入影像。 * getFusedLocationProviderClient():取得位置提供服務實例。 * File API:定義 Retrofit 的網路介面,執行檔案下載。 * ByteArrayOutputStream:將輸入串流轉為 byte array。 * Internal Storage:裝置內部儲存,用於儲存應用專屬檔案。 * FileOutputStream:Java 類別,用來將資料寫入檔案。 * WorkTag:給定任務的標籤,便於取消或追蹤工作。 * enqueueUniqueWork():只保留一個同名任務,避免重複排程。 * ExistingWorkPolicy.REPLACE:若有同名任務則取代。 * MutableStateFlow:可變的 Flow,用來追蹤狀態或資料變化。 * LaunchedEffect:Compose 中的副作用函式,用來啟動協程。 * Logcat:Android 開發工具中用來輸出日誌訊息的介面。 * WorkManager.retryPolicy:定義 Worker 的重試機制與間隔。 * InputMerger:定義合併多個輸入資料的邏輯。 * NetworkType.CONNECTED:工作需網路連線才能執行。 * WorkRequestBuilder:建構 WorkRequest 的輔助類別。 * CoroutineWorker:支援 Kotlin 協程的 WorkManager 任務執行者,允許以非同步方式執行背景工作。 * doWork():CoroutineWorker 中需覆寫的主要函式,用於執行實際任務邏輯。 * setForeground():將 Worker 設為前景執行,需提供 ForegroundInfo 物件。 * ForegroundInfo:包含通知資訊,用於前景 Worker 執行時顯示通知。 * NotificationCompat.Builder:建立相容於多版本的通知。 * Channel ID:通知所屬通道的識別字串,需與通知通道設定相符。 * setSmallIcon():設定通知圖示資源 ID。 * cacheDir:App 內部快取目錄,通常用於暫存檔案。 * FileOutputStream:Java 類別,用來將資料寫入檔案。 * outputStream.use{}:Kotlin 擴充函式,自動關閉輸出串流。 * body.bytes():Retrofit ResponseBody 的位元組資料。 * IOException:檔案處理常見例外,用於偵測儲存失敗。 * Result.failure():Worker 任務失敗回傳狀態。 * workDataOf():建立輸出/輸入資料的 key-value 資料對物件。 * WorkerParams:提供給 Worker 的參數物件,包含輸入資料與標籤等。 * WorkerKeys:自訂常數物件,用來標示輸入輸出資料的鍵名。 * toUri():將 File 轉換為 Uri,供其他元件使用。 * Result.success():Worker 任務成功回傳狀態。 * response.code():Retrofit 回應的 HTTP 狀態碼。 * Result.retry():Worker 任務暫時失敗,提示系統稍後重試。 * inputData:傳入 Worker 的資料集,用於處理上下游資料傳遞。 * BitmapFactory.decodeFile():從檔案路徑載入位圖圖像。 * Bitmap.copy():複製位圖圖像,並指定是否可修改。 * Paint.colorFilter:設定圖像繪製時的顏色濾鏡。 * LightingColorFilter:色彩濾鏡,對圖像施加 RGB 濾色效果。 * Canvas:畫布類別,允許在圖像上繪製變化。 * canvas.drawBitmap():將位圖繪製到 Canvas 上。 * bitmap.compress():將 Bitmap 壓縮並寫入輸出串流。 * CompressFormat.JPEG:JPEG 格式用於 Bitmap 壓縮。 * imageFile.exists():檢查圖像檔案是否存在。 * Dispatchers.IO:Kotlin 協程調度器,用於執行阻塞式 I/O 操作。 * withContext():Kotlin 協程函式,用於在特定調度器下執行程式區塊。 * response.isSuccessful:判斷 Retrofit 回應是否為成功狀態。 * Uri.toString():將 Uri 轉為字串,以便儲存在 WorkData 中。 * Result.failure(data):附帶錯誤資訊的失敗結果。 * delay():協程延遲執行函式,用來模擬耗時操作。 * Color Filter:圖像處理中常用來調整色彩輸出的效果。 * File.absolutePath:取得檔案的絕對路徑字串。 * Invalid Server Response:常見的 HTTP 錯誤訊息,回應內容錯誤或異常。 * Unknown Error:通用錯誤訊息,用於無法辨識的例外情況。 * file.exists():判斷檔案是否存在於指定路徑。 * launchWorker():啟動 Worker 的操作,一般透過 WorkManager 提交任務。 * Input Uri:傳遞給下一個 Worker 作為輸入資料的圖像路徑。 * Output Uri:任務完成後輸出的檔案位置。 * File API Singleton:全域 Retrofit 實例,用於下載資料。 * Retry Strategy:WorkManager 內建的重試機制。 * URI Persistence:將 Uri 轉為可序列化的字串以供 Worker 傳遞。 * Exception Handling:處理潛在失敗情況的標準機制。 * Worker Chain:使用 WorkManager 將多個任務串接執行的策略。 * Image Processing:進行圖像壓縮、濾鏡或儲存等作業。 * Image Transformation:對位圖執行轉換與覆蓋操作。 * Resource ID:Android 中資源檔案的整數識別碼。 * Notification Title:通知顯示的主標題。 * Notification Description:通知說明或次標題文字。 * `OneTimeWorkRequestBuilder`:用於建立一次性的 WorkManager 任務。 * `PeriodicWorkRequestBuilder`:建立可重複執行的定期任務。 * `Constraints.Builder`:設定執行任務前的限制條件。 * `NetworkType.CONNECTED`:指定任務執行需有網路連線。 * `setRequiresCharging(true)`:要求裝置充電時才執行任務。 * `setRequiresBatteryNotLow(true)`:要求電量非低電量時才執行任務。 * `setRequiresStorageNotLow(true)`:要求儲存空間不低時才執行任務。 * `WorkManager.getInstance(context)`:取得 WorkManager 單例。 * `enqueue()`:提交 WorkRequest 以排程執行。 * `beginUniqueWork()`:以唯一名稱啟動一串連鎖任務,避免重複。 * `ExistingWorkPolicy.KEEP`:如果任務已存在則保留原任務。 * `ExistingWorkPolicy.REPLACE`:替換現有同名任務。 * `WorkContinuation`:表示串接的任務流程,可進一步添加任務。 * `then()`:將另一個 WorkRequest 接在前一個後執行。 * `LiveData<List<WorkInfo>>`:監聽任務狀態變更的資料來源。 * `getWorkInfosForUniqueWorkLiveData(name)`:依名稱查詢相關任務狀態。 * `observeAsState()`:將 LiveData 轉換為 Compose 的狀態物件。 * `WorkInfo.getState()`:取得任務目前的狀態。 * `WorkInfo.State.RUNNING`:任務正在執行中。 * `WorkInfo.State.SUCCEEDED`:任務成功完成。 * `WorkInfo.State.FAILED`:任務失敗。 * `WorkInfo.State.ENQUEUED`:任務已排入佇列等待執行。 * `WorkInfo.State.BLOCKED`:任務因限制條件未滿足而阻塞。 * `DerivedStateOf`:Compose 中的狀態快取函式,用於避免重複運算。 * `find { it.id == xxx.id }`:根據 WorkRequest ID 找出對應 WorkInfo。 * `outputData.getString(KEY)`:從任務輸出資料中取得字串。 * `ImagePainter`:Coil 提供的圖片載入器,用於 Compose。 * `rememberImagePainter()`:記憶並加載圖片資源的函式。 * `Modifier.fillMaxWidth()`:填滿可用寬度。 * `Modifier.height(16.dp)`:設定高度。 * `Button(onClick)`:Compose 的按鈕元件與事件綁定。 * `enabled = condition`:設定按鈕是否可點擊。 * `Text(text)`:Compose 中的文字顯示元件。 * `Spacer(modifier = Modifier.height(x.dp))`:用於元件間距。 * `Unique Work Name`:唯一的工作名稱,用於識別與取消任務。 * `InputMerger`:合併多個任務輸入資料的邏輯設定。 * `setInitialDelay()`:設定任務延遲多久後開始執行。 * `setBackoffCriteria()`:設定重試策略與延遲時間。 * `Data.Builder`:建立輸入輸出資料的建構器。 * `cancelAllWork()`:取消所有排程中的任務。 * `cancelWorkById()`:依 WorkRequest ID 取消任務。 * `cancelUniqueWork()`:取消具有指定唯一名稱的任務。 * `WorkRequest.getId()`:取得任務的唯一識別 ID。 * `WorkInfo.getOutputData()`:取得任務執行後的輸出資料。 * `ApplicationContext`:作為初始化 WorkManager 所需的 Context。 * `@Suppress("BlockingMethodInNonBlockingContext")`:忽略主執行緒呼叫阻塞方法的警告。 * `Intent.FLAG_ACTIVITY_NEW_TASK`:啟動 Activity 所需的標記,用於非 Activity Context。 * `Device File Explorer`:Android Studio 工具,用於檢視應用內部檔案。 * `data/data/<package>`:Android 應用內部儲存的目錄結構。 * `cache/`:儲存暫存檔案的內部目錄。 * `deleteApp()`:移除 App 用於驗證任務是否在應用刪除後仍能執行。 * `synchronize()`:在 Device File Explorer 中重新整理內部儲存內容。 * `startDownload()`:啟動下載任務與濾鏡任務的封裝邏輯。 * `ColorFilterWorker`:第二階段任務,對圖片加上顏色濾鏡。 * `DownloadWorker`:第一階段任務,負責下載圖片至內部儲存。 * `imageUri != null`:條件判斷,若圖片存在則顯示。 * `WorkManager Enqueue Flow`:任務排程流程包含 begin → then → enqueue。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up