本程式碼研究室是 Android Kotlin 基礎課程的一部分。使用程式碼研究室逐步完成程式碼課程後,您將能充分發揮本課程的潛能。所有課程程式碼研究室清單均列於 Android Kotlin 基礎程式碼研究室到達網頁。
引言
大部分的實際應用程式都需要執行長時間的背景工作。舉例來說,應用程式可能會將檔案上傳至伺服器、從伺服器同步處理資料、將資料儲存到 Room
資料庫、將記錄傳送到伺服器,或是對昂貴的資料執行大量作業。這類動作應在背景執行,而非 UI 執行緒 (主執行緒)。背景工作會使用裝置的有限資源,例如 RAM 和電池。如果無法正常處理,可能會導致使用者體驗不佳。
在這個程式碼研究室中,您將瞭解如何使用 WorkManager
以有效且有效率的方式安排背景工作。如要進一步瞭解其他支援 Android 背景處理的解決方案,請參閱背景處理指南。
須知事項
- 如何使用
ViewModel
、LiveData
和Room
Android 架構元件。 - 如何在
LiveData
類別中進行轉換。 - 如何建立及啟動協同程式。
- 如何在資料繫結中使用繫結轉接程式。
- 如何使用存放區模式載入快取資料。
課程內容
- 如何建立
Worker
(代表工作單元)。 - 如何建立
WorkRequest
來要求執行工作。 - 如何將 限制條件加入
WorkRequest
,以定義工作站的執行方式和時機。 - 如何使用
WorkManager
安排背景工作。
執行步驟
- 建立工作站來執行背景工作,以從網路預先擷取 DevBytes 影片播放清單。
- 安排工作站定期執行。
- 在
WorkRequest
中新增限制條件。 - 排定每天執行的一次
WorkRequest
。
在本程式碼研究室中,您處理的是先前在程式碼研究室開發的 DevBytes 應用程式。(如果您沒有這個應用程式,可以下載本課程的範例程式碼)。
DevBytes 應用程式會顯示 DevByte 影片清單,這是由 Google Android 開發人員關係小組製作的簡短教學課程。這些影片會介紹 Android 開發作業的開發人員功能和最佳做法。
您每天可以預先擷取一次影片,藉此提升應用程式使用者體驗。確保使用者開啟應用程式時,就能立即取得最新內容。
在這項工作中,您可以下載並檢查範例程式碼。
步驟 1:下載並執行啟動應用程式
您可以繼續使用先前在程式碼研究室中建立的 DevBytes 應用程式 (如果有)。或者,您也可以下載啟動應用程式。
在這項工作中,您將下載並執行啟動應用程式,並檢查範例程式碼。
- 如果您尚未取得 DevBytes 應用程式,請從 GitHub 的 DevBytesRepository 專案下載這個程式碼研究室的 DevBytes 範例程式碼。
- 將程式碼解壓縮,然後在 Android Studio 中開啟專案。
- 如果測試裝置或模擬器尚未連上網際網路,請將其連上網際網路。建構並執行應用程式。應用程式會從網路中擷取 DevByte 影片清單並顯示這些影片。
- 在應用程式中輕觸任何影片,即可在 YouTube 應用程式中開啟影片。
步驟 2:探索程式碼
入門應用程式含有許多在先前程式碼研究室中導入的大量程式碼。這個程式碼研究室的範例程式碼包含網路、使用者介面、離線快取和存放區模組。您可以使用 WorkManager
安排背景工作的執行時間。
- 在 Android Studio 中,展開所有套件。
- 探索
database
套件。這個套件包含資料庫實體,以及使用Room
實作的本機資料庫。 - 探索
repository
套件。套件包含VideosRepository
類別,能夠從應用程式的其他部分抽取資料層。 - 根據先前的程式碼研究室的協助,自行探索其他範例程式碼。
WorkManager
是 Android 架構元件之一,也是 Android Jetpack 的一部分。WorkManager
適用於需要強制執行且需要保證執行的背景作業:
- 「延遲」代表工作不需要立即執行。舉例來說,將分析資料傳送至伺服器或在背景同步處理資料庫是可以延後的工作。
- 「保證執行」是指在應用程式退出或裝置重新啟動時,工作仍會執行。
WorkManager
可執行背景工作,但會相容於相容性問題和電池與系統健康狀態的最佳做法。WorkManager
提供回溯至 API 級別 14 的相容性。WorkManager
會根據裝置的 API 等級,選擇適當的安排背景工作的方式。它可能使用 JobScheduler
(API 23 以上版本) 或 AlarmManager
和 BroadcastReceiver
組合。
WorkManager
也可讓您設定背景工作執行的條件。舉例來說,您可能會希望只有在電池狀態、網路狀態或充電狀態符合特定條件時,才能執行工作。稍後您將在這個程式碼研究室中說明如何設定限制條件。
在這個程式碼研究室中,您可以排定一項工作,在一天內從聯播網預先擷取 DevBytes 播放清單。如要安排這項工作的執行時間,請使用 WorkManager
程式庫。
- 開啟
build.gradle (Module:app)
檔案,然後將WorkManager
依附元件加入專案。
如果使用程式庫的最新版本,解決方案應用程式應如預期完成編譯。如果問題仍未解決,請嘗試解決問題,或是還原至下方程式庫版本。
// WorkManager dependency
def work_version = "1.0.1"
implementation "android.arch.work:work-runtime-ktx:$work_version"
- 同步處理您的專案,並確認編譯錯誤。
在專案中加入程式碼之前,請先熟悉 WorkManager
程式庫中的下列類別:
Worker
您可以在這個課程中定義實際在背景執行的作業 (工作)。您可以延長此類別並覆寫doWork()
方法。doWork()
方法是指定要在背景執行的程式碼,例如與伺服器同步處理資料或處理圖片。您可以在這項工作中實作Worker
。WorkRequest
本課程代表在背景執行工作站的要求。使用WorkRequest
即可設定工作站工作的方式和時機,並支援Constraints
等裝置,例如裝置插頭或已連上 Wi-Fi 網路。您可以在後續工作中實作WorkRequest
。WorkManager
本課程會安排並執行你的WorkRequest
。WorkManager
會排定工作要求,在系統資源上分散負載,同時滿足您指定的限制。您可以在後續工作中實作WorkManager
。
步驟 1:建立工作站
在這項工作中,您會加入 Worker
,在背景預先擷取 DevBytes 影片播放清單。
- 在
devbyteviewer
套件中,建立名為work
的新套件。 - 在
work
套件中,建立名為RefreshDataWorker
的新 Kotlin 類別。 - 從
CoroutineWorker
類別擴充RefreshDataWorker
類別。傳入context
和WorkerParameters
做為建構函式參數。
class RefreshDataWorker(appContext: Context, params: WorkerParameters) :
CoroutineWorker(appContext, params) {
}
- 如要解決抽象類別錯誤,請覆寫
RefreshDataWorker
類別內的doWork()
方法。
override suspend fun doWork(): Result {
return Result.success()
}
懸置函式是一項可以暫停及恢復運作的函式。暫停函式可以執行長時間的執行作業,然後等待該作業完成,且不會封鎖主執行緒。
步驟 2:實作 doWork()
在背景執行緒上呼叫 Worker
類別內的 doWork()
方法。這個方法會同步執行,而且應傳回 ListenableWorker.Result
物件。Android 系統最多需要 Worker
的 10 分鐘才能完成執行,並傳回 ListenableWorker.Result
物件。這段時間過後,系統會強制停止 Worker
。
如要建立 ListenableWorker.Result
物件,請呼叫下列其中一個靜態方法,表示背景作業的完成狀態:
Result.success()
:工作順利完成。Result.failure()
:工作已永久失敗。Result.retry()
:暫時導致作業失敗,應重試。
在這項工作中,您必須實作 doWork()
方法,從網路中擷取 DevBytes 影片播放清單。您可以重複使用 VideosRepository
類別中的現有方法,從網路擷取資料。
- 在
RefreshDataWorker
類別中的doWork()
內,建立並對VideosDatabase
物件與VideosRepository
物件執行個體化。
override suspend fun doWork(): Result {
val database = getDatabase(applicationContext)
val repository = VideosRepository(database)
return Result.success()
}
- 在
RefreshDataWorker
類別的doWork()
內 (位於return
陳述式上方),呼叫try
區塊內的refreshVideos()
方法。新增記錄,以便在工作站執行時進行追蹤。
try {
repository.refreshVideos( )
Timber.d("Work request for sync is run")
} catch (e: HttpException) {
return Result.retry()
}
如要解決「未解決的參考資料」錯誤,請匯入 retrofit2.HttpException
。
- 以下是完整的
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
類別有兩個具體的實作方式:
OneTimeWorkRequest
類別適用於一次性工作。(一次性工作只會執行一次)。PeriodicWorkRequest
類別適用於定期性作業,且會反覆執行同樣的作業。
工作可設為一次性或定期,因此請依此選擇課程。如要進一步瞭解如何排定週期性工作,請參閱週期性工作說明文件。
在這項工作中,您可以定義和排定 WorkRequest
,以執行您在前一項工作中建立的工作站。
步驟 1:設定週期性工作
在 Android 應用程式中,Application
類別是包含其他所有元件 (例如活動和服務) 的基礎類別。應用程式或程序的程序建立完成之後,Application
類別 (或是 Application
的任何子類別) 會即時為其他類別套用。
在本範例應用程式中,DevByteApplication
類別是 Application
類別的子類別。DevByteApplication
類別是安排 WorkManager
的絕佳場所。
- 在
DevByteApplication
類別中,建立名為setupRecurringWork()
的方法來設定週期性背景作業。
/**
* Setup WorkManager background job to 'fetch' new network data daily.
*/
private fun setupRecurringWork() {
}
- 在
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
說明文件。
- 在
RefreshDataWorker
類別中,在類別的開頭加入隨播廣告物件。定義一個可明確識別該工作站的工作名稱。
companion object {
const val WORK_NAME = "com.example.android.devbyteviewer.work.RefreshDataWorker"
}
- 在
DevByteApplication
類別的setupRecurringWork()
方法結尾,使用enqueueUniquePeriodicWork()
方法安排工作。傳入 PeriodPeriodicWorkPolicy 的KEEP
列舉。傳入repeatingRequest
做為PeriodicWorkRequest
參數。
WorkManager.getInstance().enqueueUniquePeriodicWork(
RefreshDataWorker.WORK_NAME,
ExistingPeriodicWorkPolicy.KEEP,
repeatingRequest)
如果待處理 (未完成) 的工作名稱相同,ExistingPeriodicWorkPolicy.
KEEP
參數會讓 WorkManager
保留先前定期的作業,並捨棄新的工作要求。
- 在
DevByteApplication
類別的開頭,建立CoroutineScope
物件。傳入Dispatchers.Default
做為建構函式參數。
private val applicationScope = CoroutineScope(Dispatchers.Default)
- 在
DevByteApplication
類別中,新增delayedInit()
方法以啟動協同程式。
private fun delayedInit() {
applicationScope.launch {
}
}
- 在
delayedInit()
方法內呼叫setupRecurringWork()
。 - 將 Timber 初始化從
onCreate()
方法移至delayedInit()
方法。
private fun delayedInit() {
applicationScope.launch {
Timber.plant(Timber.DebugTree())
setupRecurringWork()
}
}
- 在
DevByteApplication
類別的onCreate()
方法結尾,新增delayedInit()
方法的呼叫。
override fun onCreate() {
super.onCreate()
delayedInit()
}
- 開啟 Android Studio 視窗底部的「Logcat」窗格。篩選
RefreshDataWorker
。 - 執行應用程式。
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 分鐘。如此一來,您便能查看系統處理定期工作要求紀錄的記錄。
- 在
DevByteApplication
類別的setupRecurringWork()
方法中,加註目前的repeatingRequest
定義。新增工作要求,且每個週期的間隔為15
分鐘。
// val repeatingRequest = PeriodicWorkRequestBuilder<RefreshDataWorker>(1, TimeUnit.DAYS)
// .build()
val repeatingRequest = PeriodicWorkRequestBuilder<RefreshDataWorker>(15, TimeUnit.MINUTES)
.build()
- 在 Android Studio 中開啟 Logcat 窗格並篩選
RefreshDataWorker
。如要清除先前的記錄,請按一下「清除 logcat」圖示.
- 執行應用程式後,「
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
物件,並對該物件設定一個網路限制限制。(只有一個限制會更容易發現記錄檔)。在稍後的步驟中,請新增更多限制條件)。
- 在
DevByteApplication
類別中,在setupRecurringWork()
的開頭定義Constraints
類型的val
。請使用Constraints.Builder()
方法。
val constraints = Constraints.Builder()
如要解決這個錯誤,請匯入 androidx.work.Constraints
。
- 使用
setRequiredNetworkType()
方法在constraints
物件中新增網路類型限制。使用UNMETERED
列舉,這樣裝置才會在非計量付費網路上執行。
.setRequiredNetworkType(NetworkType.UNMETERED)
- 使用
build()
方法從建構工具產生限制。
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED)
.build()
現在您需要將新建立的 Constraints
物件設為工作要求。
- 在
DevByteApplication
類別的setupRecurringWork()
方法中,將Constraints
物件設為定期的工作要求repeatingRequest
。如要設定限制條件,請在build()
方法呼叫上方加入setConstraints()
方法。
val repeatingRequest = PeriodicWorkRequestBuilder<RefreshDataWorker>(15, TimeUnit.MINUTES)
.setConstraints(constraints)
.build()
步驟 2:執行應用程式並記下記錄檔
在這個步驟中,您將執行應用程式,並發現在背景執行的受限制工作要求會按間隔執行。
- 如要取消任何已排定的工作,請從裝置或模擬器中解除安裝應用程式。
- 在 Android Studio 中開啟「Logcat」窗格。在「Logcat」窗格中,按一下左側的「Clear logcat」圖示
來清除先前的記錄。篩選
work
。 - 關閉裝置或模擬器的 Wi-Fi,即可瞭解限制的運作方式。目前的程式碼僅會設定一項限制,表示該要求應只在非計量付費網路上執行。由於 Wi-Fi 處於關閉狀態,因此裝置未連上網路、計量付費或未計量付費。因此無法達成這項限制。
- 執行應用程式,並查看 Logcat 窗格。
WorkManager
會立即安排背景工作。因為不符合網路限制,所以無法執行工作。
11:31:44 D/DevByteApplication: Periodic Work request for sync is scheduled
- 開啟裝置或模擬器的 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
類別中實作以下內容。
- 在
DevByteApplication
類別的setupRecurringWork()
方法中,表示只有在電池電力不足時,才應執行工作要求。在build()
方法呼叫之前加入限制條件,並使用setRequiresBatteryNotLow()
方法。
.setRequiresBatteryNotLow(true)
- 更新工作要求,確保裝置只在充電時執行。在
build()
方法呼叫之前加入限制條件,並使用setRequiresCharging()
方法。
.setRequiresCharging(true)
- 更新工作要求,讓裝置只在閒置時執行。在
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()
- 在
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)
}
- 如要移除先前排定的工作要求,請在裝置或模擬器中解除安裝 DevBytes 應用程式。
- 執行應用程式後,「
WorkManager
」會立即排定工作要求。工作要求會每天執行一次,滿足所有限制。 - 即使應用程式未執行,這個工作要求仍會在背景執行。基於這個原因,建議您從手機解除安裝應用程式。
太棒了!您在 DevBytes 應用程式中實作並安排了電池友善的工作執行要求,每天接收一次影片。WorkManager
將安排和執行工作,並將系統資源最佳化。您的使用者及其電池會很滿意。
Android Studio 專案:DevBytesWorkManager。
WorkManager
API 可讓您輕鬆安排可持續執行的可延遲非同步工作。- 大部分的實際應用程式都需要執行長時間的背景工作。如要以最佳化且有效率的方式安排背景工作,請使用
WorkManager
。 WorkManager
程式庫中的主要類別為Worker
、WorkRequest
和WorkManager
。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
▢ OneTimeWorkRequest
和 PeriodicWorkRequest
▢ OneTimeWorkRequest
和 RecurringWorkRequest
▢ OneTimeOffWorkRequest
和 RecurringWorkRequest
第 2 題
WorkManager
會在 API 23 以上版本中使用下列類別排定背景工作?
▢ 僅限JobScheduler
▢ BroadcastReceiver
和 AlarmManager
▢ AlarmManager
和 JobScheduler
▢ Scheduler
和 BroadcastReceiver
第 3 題
您使用哪個 API 為 WorkRequest
加入限制條件?
▢ setConstraints()
▢ addConstraints()
▢ setConstraint()
▢ addConstraintsToWorkRequest()
開始下一門課程:
如要瞭解本課程中其他程式碼研究室的連結,請參閱 Android Kotlin 基礎程式碼程式碼到達網頁。