Android Kotlin 基礎課程 09.2:WorkManager

本程式碼研究室是 Android Kotlin 基礎課程的一部分。使用程式碼研究室逐步完成程式碼課程後,您將能充分發揮本課程的潛能。所有課程程式碼研究室清單均列於 Android Kotlin 基礎程式碼研究室到達網頁

引言

大部分的實際應用程式都需要執行長時間的背景工作。舉例來說,應用程式可能會將檔案上傳至伺服器、從伺服器同步處理資料、將資料儲存到 Room 資料庫、將記錄傳送到伺服器,或是對昂貴的資料執行大量作業。這類動作應在背景執行,而非 UI 執行緒 (主執行緒)。背景工作會使用裝置的有限資源,例如 RAM 和電池。如果無法正常處理,可能會導致使用者體驗不佳。

在這個程式碼研究室中,您將瞭解如何使用 WorkManager 以有效且有效率的方式安排背景工作。如要進一步瞭解其他支援 Android 背景處理的解決方案,請參閱背景處理指南

須知事項

課程內容

  • 如何建立 Worker (代表工作單元)。
  • 如何建立 WorkRequest 來要求執行工作。
  • 如何將 限制條件加入 WorkRequest,以定義工作站的執行方式和時機。
  • 如何使用 WorkManager 安排背景工作。

執行步驟

  • 建立工作站來執行背景工作,以從網路預先擷取 DevBytes 影片播放清單。
  • 安排工作站定期執行。
  • WorkRequest 中新增限制條件。
  • 排定每天執行的一次 WorkRequest

在本程式碼研究室中,您處理的是先前在程式碼研究室開發的 DevBytes 應用程式。(如果您沒有這個應用程式,可以下載本課程的範例程式碼)。

DevBytes 應用程式會顯示 DevByte 影片清單,這是由 Google Android 開發人員關係小組製作的簡短教學課程。這些影片會介紹 Android 開發作業的開發人員功能和最佳做法。

您每天可以預先擷取一次影片,藉此提升應用程式使用者體驗。確保使用者開啟應用程式時,就能立即取得最新內容。

在這項工作中,您可以下載並檢查範例程式碼。

步驟 1:下載並執行啟動應用程式

您可以繼續使用先前在程式碼研究室中建立的 DevBytes 應用程式 (如果有)。或者,您也可以下載啟動應用程式。

在這項工作中,您將下載並執行啟動應用程式,並檢查範例程式碼。

  1. 如果您尚未取得 DevBytes 應用程式,請從 GitHub 的 DevBytesRepository 專案下載這個程式碼研究室的 DevBytes 範例程式碼。
  2. 將程式碼解壓縮,然後在 Android Studio 中開啟專案。
  3. 如果測試裝置或模擬器尚未連上網際網路,請將其連上網際網路。建構並執行應用程式。應用程式會從網路中擷取 DevByte 影片清單並顯示這些影片。
  4. 在應用程式中輕觸任何影片,即可在 YouTube 應用程式中開啟影片。

步驟 2:探索程式碼

入門應用程式含有許多在先前程式碼研究室中導入的大量程式碼。這個程式碼研究室的範例程式碼包含網路、使用者介面、離線快取和存放區模組。您可以使用 WorkManager 安排背景工作的執行時間。

  1. 在 Android Studio 中,展開所有套件。
  2. 探索 database 套件。這個套件包含資料庫實體,以及使用 Room 實作的本機資料庫。
  3. 探索 repository 套件。套件包含 VideosRepository 類別,能夠從應用程式的其他部分抽取資料層。
  4. 根據先前的程式碼研究室的協助,自行探索其他範例程式碼。

WorkManagerAndroid 架構元件之一,也是 Android Jetpack 的一部分。WorkManager 適用於需要強制執行且需要保證執行的背景作業:

  • 「延遲」代表工作不需要立即執行。舉例來說,將分析資料傳送至伺服器或在背景同步處理資料庫是可以延後的工作。
  • 「保證執行」是指在應用程式退出或裝置重新啟動時,工作仍會執行。

WorkManager 可執行背景工作,但會相容於相容性問題和電池與系統健康狀態的最佳做法。WorkManager 提供回溯至 API 級別 14 的相容性。WorkManager 會根據裝置的 API 等級,選擇適當的安排背景工作的方式。它可能使用 JobScheduler (API 23 以上版本) 或 AlarmManagerBroadcastReceiver 組合。

WorkManager 也可讓您設定背景工作執行的條件。舉例來說,您可能會希望只有在電池狀態、網路狀態或充電狀態符合特定條件時,才能執行工作。稍後您將在這個程式碼研究室中說明如何設定限制條件。

在這個程式碼研究室中,您可以排定一項工作,在一天內從聯播網預先擷取 DevBytes 播放清單。如要安排這項工作的執行時間,請使用 WorkManager 程式庫。

  1. 開啟 build.gradle (Module:app) 檔案,然後將 WorkManager 依附元件加入專案。

    如果使用程式庫的最新版本,解決方案應用程式應如預期完成編譯。如果問題仍未解決,請嘗試解決問題,或是還原至下方程式庫版本。
// WorkManager dependency
def work_version = "1.0.1"
implementation "android.arch.work:work-runtime-ktx:$work_version"
  1. 同步處理您的專案,並確認編譯錯誤。

在專案中加入程式碼之前,請先熟悉 WorkManager 程式庫中的下列類別:

  • Worker
    您可以在這個課程中定義實際在背景執行的作業 (工作)。您可以延長此類別並覆寫 doWork() 方法。doWork() 方法是指定要在背景執行的程式碼,例如與伺服器同步處理資料或處理圖片。您可以在這項工作中實作 Worker
  • WorkRequest
    本課程代表在背景執行工作站的要求。使用 WorkRequest 即可設定工作站工作的方式和時機,並支援 Constraints 等裝置,例如裝置插頭或已連上 Wi-Fi 網路。您可以在後續工作中實作 WorkRequest
  • WorkManager
    本課程會安排並執行你的 WorkRequestWorkManager 會排定工作要求,在系統資源上分散負載,同時滿足您指定的限制。您可以在後續工作中實作 WorkManager

步驟 1:建立工作站

在這項工作中,您會加入 Worker,在背景預先擷取 DevBytes 影片播放清單。

  1. devbyteviewer 套件中,建立名為 work 的新套件。
  2. work 套件中,建立名為 RefreshDataWorker 的新 Kotlin 類別。
  3. CoroutineWorker 類別擴充 RefreshDataWorker 類別。傳入 contextWorkerParameters 做為建構函式參數。
class RefreshDataWorker(appContext: Context, params: WorkerParameters) :
       CoroutineWorker(appContext, params) {
}
  1. 如要解決抽象類別錯誤,請覆寫 RefreshDataWorker 類別內的 doWork() 方法。
override suspend fun doWork(): Result {
  return Result.success()
}

懸置函式是一項可以暫停及恢復運作的函式。暫停函式可以執行長時間的執行作業,然後等待該作業完成,且不會封鎖主執行緒。

步驟 2:實作 doWork()

在背景執行緒上呼叫 Worker 類別內的 doWork() 方法。這個方法會同步執行,而且應傳回 ListenableWorker.Result 物件。Android 系統最多需要 Worker 的 10 分鐘才能完成執行,並傳回 ListenableWorker.Result 物件。這段時間過後,系統會強制停止 Worker

如要建立 ListenableWorker.Result 物件,請呼叫下列其中一個靜態方法,表示背景作業的完成狀態:

在這項工作中,您必須實作 doWork() 方法,從網路中擷取 DevBytes 影片播放清單。您可以重複使用 VideosRepository 類別中的現有方法,從網路擷取資料。

  1. RefreshDataWorker 類別中的 doWork() 內,建立並對 VideosDatabase 物件與 VideosRepository 物件執行個體化。
override suspend fun doWork(): Result {
   val database = getDatabase(applicationContext)
   val repository = VideosRepository(database)

   return Result.success()
}
  1. RefreshDataWorker 類別的 doWork() 內 (位於 return 陳述式上方),呼叫 try 區塊內的 refreshVideos() 方法。新增記錄,以便在工作站執行時進行追蹤。
try {
   repository.refreshVideos( )
   Timber.d("Work request for sync is run")
   } catch (e: HttpException) {
   return Result.retry()
}

如要解決「未解決的參考資料」錯誤,請匯入 retrofit2.HttpException

  1. 以下是完整的 RefreshDataWorker 類別供您參考:
class RefreshDataWorker(appContext: Context, params: WorkerParameters) :
       CoroutineWorker(appContext, params) {

   override suspend fun doWork(): Result {
       val database = getDatabase(applicationContext)
       val repository = VideosRepository(database)
       try {
           repository.refreshVideos()
       } catch (e: HttpException) {
           return Result.retry()
       }
       return Result.success()
   }
}

Worker 負責定義工作單元,WorkRequest 則定義工作的方式和時機。WorkRequest 類別有兩個具體的實作方式:

工作可設為一次性或定期,因此請依此選擇課程。如要進一步瞭解如何排定週期性工作,請參閱週期性工作說明文件

在這項工作中,您可以定義和排定 WorkRequest,以執行您在前一項工作中建立的工作站。

步驟 1:設定週期性工作

在 Android 應用程式中,Application 類別是包含其他所有元件 (例如活動和服務) 的基礎類別。應用程式或程序的程序建立完成之後,Application 類別 (或是 Application 的任何子類別) 會即時為其他類別套用。

在本範例應用程式中,DevByteApplication 類別是 Application 類別的子類別。DevByteApplication 類別是安排 WorkManager 的絕佳場所。

  1. DevByteApplication 類別中,建立名為 setupRecurringWork() 的方法來設定週期性背景作業。
/**
* Setup WorkManager background job to 'fetch' new network data daily.
*/
private fun setupRecurringWork() {
}
  1. setupRecurringWork() 方法中,使用 PeriodicWorkRequestBuilder() 方法建立並初始化每天執行的一次工作要求。傳入您在先前工作中建立的 RefreshDataWorker 類別。傳回 1 的重複間隔,時間單位為 TimeUnit.DAYS
val repeatingRequest = PeriodicWorkRequestBuilder<RefreshDataWorker>(1, TimeUnit.DAYS)
       .build()

如要解決這個錯誤,請匯入 java.util.concurrent.TimeUnit

步驟 2:使用 WorkManager 安排 WorkRequest

定義 WorkRequest 後,您可以使用 enqueueUniquePeriodicWork() 方法透過 WorkManager 排定發布時間。這個方法可讓您在佇列中新增唯一名稱的 PeriodicWorkRequest,且每個名稱中只能有一個已啟用的 PeriodicWorkRequest

舉例來說,您可能只想啟動一項同步作業。如果正在等候一項同步處理作業,您可以使用 CurrentPeriodicWorkPolicy 選擇要讓它執行或取代新作業。

如要進一步瞭解如何排定 WorkRequest 的執行方式,請參閱 WorkManager 說明文件。

  1. RefreshDataWorker 類別中,在類別的開頭加入隨播廣告物件。定義一個可明確識別該工作站的工作名稱。
companion object {
   const val WORK_NAME = "com.example.android.devbyteviewer.work.RefreshDataWorker"
}
  1. DevByteApplication 類別的 setupRecurringWork() 方法結尾,使用 enqueueUniquePeriodicWork() 方法安排工作。傳入 PeriodPeriodicWorkPolicy 的 KEEP 列舉。傳入 repeatingRequest 做為 PeriodicWorkRequest 參數。
WorkManager.getInstance().enqueueUniquePeriodicWork(
       RefreshDataWorker.WORK_NAME,
       ExistingPeriodicWorkPolicy.KEEP,
       repeatingRequest)

如果待處理 (未完成) 的工作名稱相同,ExistingPeriodicWorkPolicy.KEEP 參數會讓 WorkManager 保留先前定期的作業,並捨棄新的工作要求。

  1. DevByteApplication 類別的開頭,建立 CoroutineScope 物件。傳入 Dispatchers.Default 做為建構函式參數。
private val applicationScope = CoroutineScope(Dispatchers.Default)
  1. DevByteApplication 類別中,新增 delayedInit() 方法以啟動協同程式。
private fun delayedInit() {
   applicationScope.launch {
   }
}
  1. delayedInit() 方法內呼叫 setupRecurringWork()
  2. 將 Timber 初始化從 onCreate() 方法移至 delayedInit() 方法。
private fun delayedInit() {
   applicationScope.launch {
       Timber.plant(Timber.DebugTree())
       setupRecurringWork()
   }
}
  1. DevByteApplication 類別的 onCreate() 方法結尾,新增 delayedInit() 方法的呼叫。
override fun onCreate() {
   super.onCreate()
   delayedInit()
}
  1. 開啟 Android Studio 視窗底部的「Logcat」窗格。篩選 RefreshDataWorker
  2. 執行應用程式。WorkManager 會立即排定週期性作業。

    在「Logcat」(記錄) 窗格中,找出記錄工作已排程且記錄執行成功的記錄陳述式。
D/RefreshDataWorker: Work request for sync is run
I/WM-WorkerWrapper: Worker result SUCCESS for Work [...]

WM-WorkerWrapper 記錄會顯示於 WorkManager 程式庫中,因此您無法變更此記錄訊息。

步驟 3:(選用) 將 WorkRequest 設為最短時間間隔

在此步驟中,您要將時間間隔從 1 天縮短為 15 分鐘。如此一來,您便能查看系統處理定期工作要求紀錄的記錄。

  1. DevByteApplication 類別的 setupRecurringWork() 方法中,加註目前的 repeatingRequest 定義。新增工作要求,且每個週期的間隔為 15 分鐘。
// val repeatingRequest = PeriodicWorkRequestBuilder<RefreshDataWorker>(1, TimeUnit.DAYS)
//        .build()
val repeatingRequest = PeriodicWorkRequestBuilder<RefreshDataWorker>(15, TimeUnit.MINUTES)
       .build()
  1. 在 Android Studio 中開啟 Logcat 窗格並篩選 RefreshDataWorker。如要清除先前的記錄,請按一下「清除 logcat」圖示 .
  2. 執行應用程式後,「WorkManager」會立即排定週期性作業。請在「Logcat」窗格中查看記錄,每 15 分鐘會執行一次工作要求。等待 15 分鐘查看其他組要求記錄。你可以選擇讓應用程式保持運作或關閉,但工作管理員應仍在執行。

    請注意,時間間隔有時不到 15 分鐘,有時甚至超過 15 分鐘。(確切時間取決於 OS 電池效能最佳化)。
12:44:40 D/RefreshDataWorker: Work request for sync is run
12:44:40 I/WM-WorkerWrapper: Worker result SUCCESS for Work 
12:59:24 D/RefreshDataWorker: Work request for sync is run
12:59:24 I/WM-WorkerWrapper: Worker result SUCCESS for Work 
13:15:03 D/RefreshDataWorker: Work request for sync is run
13:15:03 I/WM-WorkerWrapper: Worker result SUCCESS for Work 
13:29:22 D/RefreshDataWorker: Work request for sync is run
13:29:22 I/WM-WorkerWrapper: Worker result SUCCESS for Work 
13:44:26 D/RefreshDataWorker: Work request for sync is run
13:44:26 I/WM-WorkerWrapper: Worker result SUCCESS for Work
 

恭喜!你已建立工作站,並已透過 WorkManager 安排工作要求。但系統發生問題:您尚未指定任何限制條件。WorkManager 每天安排工作一次,即使裝置電量不足、睡眠不足或沒有網路連線也不例外。這會影響裝置的電池效能和效能,但可能會導致使用者體驗不佳。

在下一項工作中,您可以設定限制條件來解決這項問題。

在先前的工作中,您使用 WorkManager 排定工作要求。在這項工作中,您會加入執行條件的條件。

定義 WorkRequest 時,您可以指定 Worker 的執行時間限制。舉例來說,您可以指定只有在裝置處於閒置狀態時執行該工作,或是只在裝置接上電源並連上 Wi-Fi 時執行該工作。您也可以指定重試工作的輪詢政策。支援的限制條件Constraints.Builder 中設定的方法。詳情請參閱定義工作要求

步驟 1:新增 Constraints 物件並設定一個限制條件

在這個步驟中,您會建立一個 Constraints 物件,並對該物件設定一個網路限制限制。(只有一個限制會更容易發現記錄檔)。在稍後的步驟中,請新增更多限制條件)。

  1. DevByteApplication 類別中,在 setupRecurringWork() 的開頭定義 Constraints 類型的 val。請使用 Constraints.Builder() 方法。
val constraints = Constraints.Builder()

如要解決這個錯誤,請匯入 androidx.work.Constraints

  1. 使用 setRequiredNetworkType() 方法在 constraints 物件中新增網路類型限制。使用 UNMETERED 列舉,這樣裝置才會在非計量付費網路上執行。
.setRequiredNetworkType(NetworkType.UNMETERED)
  1. 使用 build() 方法從建構工具產生限制。
val constraints = Constraints.Builder()
       .setRequiredNetworkType(NetworkType.UNMETERED)
       .build()

現在您需要將新建立的 Constraints 物件設為工作要求。

  1. DevByteApplication 類別的 setupRecurringWork() 方法中,將 Constraints 物件設為定期的工作要求 repeatingRequest。如要設定限制條件,請在 build() 方法呼叫上方加入 setConstraints() 方法。
       val repeatingRequest = PeriodicWorkRequestBuilder<RefreshDataWorker>(15, TimeUnit.MINUTES)
               .setConstraints(constraints)
               .build()

步驟 2:執行應用程式並記下記錄檔

在這個步驟中,您將執行應用程式,並發現在背景執行的受限制工作要求會按間隔執行。

  1. 如要取消任何已排定的工作,請從裝置或模擬器中解除安裝應用程式。
  2. 在 Android Studio 中開啟「Logcat」窗格。在「Logcat」窗格中,按一下左側的「Clear logcat」圖示 來清除先前的記錄。篩選 work
  3. 關閉裝置或模擬器的 Wi-Fi,即可瞭解限制的運作方式。目前的程式碼僅會設定一項限制,表示該要求應只在非計量付費網路上執行。由於 Wi-Fi 處於關閉狀態,因此裝置未連上網路、計量付費或未計量付費。因此無法達成這項限制。
  4. 執行應用程式,並查看 Logcat 窗格。WorkManager 會立即安排背景工作。因為不符合網路限制,所以無法執行工作。
11:31:44 D/DevByteApplication: Periodic Work request for sync is scheduled
  1. 開啟裝置或模擬器的 Wi-Fi,然後查看 Logcat 窗格。現在只要符合網路限制,排定的背景工作約每 15 分鐘會執行一次。
11:31:44 D/DevByteApplication: Periodic Work request for sync is scheduled
11:31:47 D/RefreshDataWorker: Work request for sync is run
11:31:47 I/WM-WorkerWrapper: Worker result SUCCESS for Work [...]
11:46:45 D/RefreshDataWorker: Work request for sync is run
11:46:45 I/WM-WorkerWrapper: Worker result SUCCESS for Work [...] 
12:03:05 D/RefreshDataWorker: Work request for sync is run
12:03:05 I/WM-WorkerWrapper: Worker result SUCCESS for Work [...] 
12:16:45 D/RefreshDataWorker: Work request for sync is run
12:16:45 I/WM-WorkerWrapper: Worker result SUCCESS for Work [...] 
12:31:45 D/RefreshDataWorker: Work request for sync is run
12:31:45 I/WM-WorkerWrapper: Worker result SUCCESS for Work [...] 
12:47:05 D/RefreshDataWorker: Work request for sync is run
12:47:05 I/WM-WorkerWrapper: Worker result SUCCESS for Work [...] 
13:01:45 D/RefreshDataWorker: Work request for sync is run
13:01:45 I/WM-WorkerWrapper: Worker result SUCCESS for Work [...]

步驟 3:新增更多限制條件

在這個步驟中,您將下列限制新增至 PeriodicWorkRequest

  • 電量不足。
  • 裝置充電中。
  • 裝置處於閒置狀態;僅適用於 API 級別 23 (Android M) 以上版本。

DevByteApplication 類別中實作以下內容。

  1. DevByteApplication 類別的 setupRecurringWork() 方法中,表示只有在電池電力不足時,才應執行工作要求。在 build() 方法呼叫之前加入限制條件,並使用 setRequiresBatteryNotLow() 方法。
.setRequiresBatteryNotLow(true)
  1. 更新工作要求,確保裝置只在充電時執行。在 build() 方法呼叫之前加入限制條件,並使用 setRequiresCharging() 方法。
.setRequiresCharging(true)
  1. 更新工作要求,讓裝置只在閒置時執行。在 build() 方法呼叫之前加入限制條件,並使用 setRequiresDeviceIdle() 方法。這項限制只會在使用者未主動使用裝置的情況下執行工作要求。這項功能僅適用於 Android 6.0 (Marshmallow) 以上版本,因此請針對 SDK 版本 M 以上版本新增條件。
.apply {
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
       setRequiresDeviceIdle(true)
   }
}

以下是 constraints 物件的完整定義。

val constraints = Constraints.Builder()
       .setRequiredNetworkType(NetworkType.UNMETERED)
       .setRequiresBatteryNotLow(true)
       .setRequiresCharging(true)
       .apply {
           if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
               setRequiresDeviceIdle(true)
           }
       }
       .build()
  1. setupRecurringWork() 方法中,將要求間隔變更為一天一次。
val repeatingRequest = PeriodicWorkRequestBuilder<RefreshDataWorker>(1, TimeUnit.DAYS)
       .setConstraints(constraints)
       .build()

以下是 setupRecurringWork() 方法的完整實作和記錄,方便您追蹤已排定的工作要求排定時間。

private fun setupRecurringWork() {

       val constraints = Constraints.Builder()
               .setRequiredNetworkType(NetworkType.UNMETERED)
               .setRequiresBatteryNotLow(true)
               .setRequiresCharging(true)
               .apply {
                   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                       setRequiresDeviceIdle(true)
                   }
               }
               .build()
       val repeatingRequest = PeriodicWorkRequestBuilder<RefreshDataWorker>(1, TimeUnit.DAYS)
               .setConstraints(constraints)
               .build()
       
       Timber.d("Periodic Work request for sync is scheduled")
       WorkManager.getInstance().enqueueUniquePeriodicWork(
               RefreshDataWorker.WORK_NAME,
               ExistingPeriodicWorkPolicy.KEEP,
               repeatingRequest)
   }
  1. 如要移除先前排定的工作要求,請在裝置或模擬器中解除安裝 DevBytes 應用程式。
  2. 執行應用程式後,「WorkManager」會立即排定工作要求。工作要求會每天執行一次,滿足所有限制。
  3. 即使應用程式未執行,這個工作要求仍會在背景執行。基於這個原因,建議您從手機解除安裝應用程式。

太棒了!您在 DevBytes 應用程式中實作並安排了電池友善的工作執行要求,每天接收一次影片。WorkManager 將安排和執行工作,並將系統資源最佳化。您的使用者及其電池會很滿意。

Android Studio 專案:DevBytesWorkManager

  • WorkManager API 可讓您輕鬆安排可持續執行的可延遲非同步工作。
  • 大部分的實際應用程式都需要執行長時間的背景工作。如要以最佳化且有效率的方式安排背景工作,請使用 WorkManager
  • WorkManager 程式庫中的主要類別為 WorkerWorkRequestWorkManager
  • Worker 類別代表工作單元。如要實作背景工作,請擴充 Worker 類別並覆寫 doWork() 方法。
  • WorkRequest 類別代表要求執行單元。WorkRequest 是為您在 WorkManager 中排程的工作指定參數的基礎類別。
  • WorkRequest 類別有兩個具體實作方法:OneTimeWorkRequest 可處理一次性工作,PeriodicWorkRequest 則用於定期性工作要求。
  • 定義 WorkRequest 時,您可以指定 Constraints,表示 Worker 的執行時機。限制設定包括裝置是否接上電源、裝置是否處於閒置狀態或是否連上 Wi-Fi 網路。
  • 如要為 WorkRequest 加入限制條件,請使用 Constraints.Builder 說明文件中列出的設定方法。舉例來說,如要指出裝置的電量不足時不應執行 WorkRequest,請使用 setRequiresBatteryNotLow() 設定方法。
  • 定義 WorkRequest 之後,請將工作交給 Android 系統。方法是使用其中一種 WorkManager enqueue 方法來排定工作。
  • 執行 Worker 的確切時間,取決於 WorkRequest 中採用的限制和系統最佳化作業。基於這些限制,「WorkManager」的設計是盡可能提供最佳行為。

Udacity 課程:

Android 開發人員說明文件:

其他:

這個部分會列出在代碼研究室中,受老師主導的課程作業的可能學生作業。由老師自行決定要執行下列動作:

  • 視需要指派家庭作業。
  • 告知學生如何提交家庭作業。
  • 批改家庭作業。

老師可視需要使用這些建議,並視情況指派其他合適的家庭作業。

如果您是自行操作本程式碼研究室,歡迎透過這些家庭作業來測試自己的知識。

第 1 題

WorkRequest」類別的具體導入方式為何?

OneTimeWorkPeriodicRequest

OneTimeWorkRequestPeriodicWorkRequest

OneTimeWorkRequestRecurringWorkRequest

OneTimeOffWorkRequestRecurringWorkRequest

第 2 題

WorkManager 會在 API 23 以上版本中使用下列類別排定背景工作?

▢ 僅限JobScheduler

BroadcastReceiverAlarmManager

AlarmManagerJobScheduler

SchedulerBroadcastReceiver

第 3 題

您使用哪個 API 為 WorkRequest 加入限制條件?

setConstraints()

addConstraints()

setConstraint()

addConstraintsToWorkRequest()

開始下一門課程:10.1 樣式和主題

如要瞭解本課程中其他程式碼研究室的連結,請參閱 Android Kotlin 基礎程式碼程式碼到達網頁