專案:Water Me! 應用程式

1. 事前準備

本程式碼研究室將介紹一款名為 Water Me 的新應用程式,需由您自行建構。本程式碼研究室將引導您逐步完成 Water Me 應用程式專案,包括在 Android Studio 中設定和測試專案。

必要條件

  • 此專案適用於已完成 Android Kotlin 基本概念課程單元 6 的學員。

建構項目

  • 在現有應用程式中使用自訂 Worker 安排通知。

軟硬體需求

  • 已安裝 Android Studio 的電腦。

2. 已完成應用程式總覽

Water Me! 應用程式包含植物清單、植物相關資訊,以及各種植物的正常澆水頻率說明。完成後的應用程式將可針對每一種植物安排澆水提醒。

90be029855bc3111.png

即使未運作 Water Me! 應用程式,裝置上仍會以通知形式顯示提醒。只要輕觸通知,即可啟動 Water Me! 應用程式。

df244d6749f69085.png

如要使用這項功能,您必須使用顯示通知的自訂 Worker 來安排背景工作。

3. 開始操作

下載專案程式碼

請注意,資料夾名稱是 android-basics-kotlin-water-me-app。在 Android Studio 中開啟專案時,請選取這個資料夾。

如要取得這個程式碼研究室的程式碼,並在 Android Studio 中開啟,請按照下列步驟操作:

取得程式碼

  1. 按一下所提供的網址。系統會在瀏覽器中開啟專案的 GitHub 頁面。
  2. 在專案的 GitHub 頁面中,按一下「Code」 按鈕開啟對話方塊。

5b0a76c50478a73f.png

  1. 在對話方塊中,按一下「Download ZIP」 按鈕,將專案儲存到電腦。等待下載作業完成。
  2. 在電腦上找到檔案 (可能位於「Downloads」 資料夾中)。
  3. 按兩下 ZIP 檔案,將檔案解壓縮。這項操作會建立含有專案檔案的新資料夾。

在 Android Studio 中開啟專案

  1. 啟動 Android Studio。
  2. 在「Welcome to Android Studio」 視窗中,按一下「Open an existing Android Studio project」

36cc44fcf0f89a1d.png

注意:如果 Android Studio 已開啟,請依序選取「File」 >「New」 >「Import Project」 選單選項。

21f3eec988dcfbe9.png

  1. 在「Import Project」對話方塊中,前往未壓縮專案資料夾所在的位置 (可能位於「Downloads」資料夾中)。
  2. 按兩下該專案資料夾。
  3. 等待 Android Studio 開啟專案。
  4. 按一下「Run」 按鈕 11c34fc5e516fb1c.png 即可建構並執行應用程式。請確認應用程式建構地符合您的預期。
  5. 在「Project」工具視窗中瀏覽專案檔案,查看應用程式的設定方式。

4. 使用 WorkManager 安排通知

除安排時間與通知部分外,已實作 Water Me! 應用程式的所有功能。顯示通知的程式碼位於 WaterReminderWorker.kt (位於 worker 套件中)。這項操作將會在自訂 Worker 類別的 doWork() 方法中執行。由於通知可能是新主題,因此已實作程式碼。

override fun doWork(): Result {
    val intent = Intent(applicationContext, MainActivity::class.java).apply {
        flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
    }

    val pendingIntent: PendingIntent = PendingIntent
        .getActivity(applicationContext, 0, intent, 0)

    val plantName = inputData.getString(nameKey)

    val builder = NotificationCompat.Builder(applicationContext, BaseApplication.CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_android_black_24dp)
        .setContentTitle("Water me!")
        .setContentText("It's time to water your $plantName")
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setContentIntent(pendingIntent)
        .setAutoCancel(true)

    with(NotificationManagerCompat.from(applicationContext)) {
        notify(notificationId, builder.build())
    }

    return Result.success()
}

您的工作是建立 OneTimeWorkRequest,以使用 PlantViewModel 的正確參數呼叫此方法。

建立工作要求。

如要安排通知,您必須在 PlantViewModel.kt 中實作 scheduleReminder() 方法。

  1. 使用 Data.Builder 建立名稱為 data 的變數。資料應包含單一字串值,其中 WaterReminder.Worker.nameKey 是鍵,而傳入至 scheduleReminder()plantName 為值。
  2. 使用 WaterReminderWorker 及傳入 scheduleReminder() 函式的 delayunit 建立一次性工作要求,並將輸入資料設為您建立的 data 變數。
  3. 呼叫 workManagerenqueueUniqueWork() 方法,將 REPLACE 做為 ExistingWorkPolicy 傳入植物名稱,以及工作要求。

您的應用程式現在應可正常運作。由於每個提醒需要較長的時間顯示,因此建議您執行隨附的測試,確認通知是否正常運作。

5. 測試操作說明

執行測試

如要執行測試,請執行下列其中一項操作:

若是單一測試案例,請開啟測試案例類別,然後按一下類別宣告左側的綠色箭頭。然後,從選單中選取「Run」選項。這麼做將會執行測試案例中的所有測試。

a32317d35c77142b.png

您通常只需要執行一項測試,例如只有一個測試失敗,另一個則通過測試。執行單一測試的做法,與執行整個測試案例一樣。使用綠色箭頭並選取「Run」選項。

ac6244434cfafb60.png