练习:Water Me! 应用

1. 准备工作

简介

在本单元中,您已学习了 WorkManager 的相关知识,它是一个适用于可延迟型后台工作的 Jetpack 库。即使您关闭了源应用,这类后台工作也一定会运行。

在学习 WorkManager 的过程中,您学习了如何在 worker 类中定义工作、如何为 worker 创建 WorkRequest,以及如何将工作加入队列和调度工作。

在本练习集内,您将运用所学的概念来完善 Water Me! 应用。

解决方案代码就在文末。为了充分发挥此学习体验的效果,请尝试尽量自行进行实现和问题排查,之后再查看所提供的解决方案代码。只有亲自动手实践,才能获得最好的学习效果。

前提条件

所需条件

  • 一台连接到互联网并安装了 Android Studio 的计算机

构建内容

在本练习集内,您将运用所学的概念来完善 Water Me! 应用。

该应用目前在滚动式列表中显示了一系列植物。如果您点按某种植物,该应用就会让您为它设置浇水提醒。

fb69d6519999f217.png d6b68d1e9f1026c5.png

虽然您可以选择提醒时间范围,但系统不会显示提醒通知。

您的任务是实现后台工作,使系统显示提醒通知。

您完成代码后,该应用就会在选定的时长过后显示提醒通知。

a8f9bceed83af5a9.png

2. 获取起始代码

首先,请下载起始代码:

或者,您也可以克隆该代码的 GitHub 代码库:

$ git clone https://github.com/google-developer-training/basic-android-kotlin-compose-training-waterme.git
$ cd basic-android-kotlin-compose-training-waterme
$ git checkout starter

您可以在此 GitHub 代码库中浏览 Water Me! 应用的代码。

运行起始代码

若要熟悉起始代码,请完成以下步骤:

  1. 在 Android Studio 中打开包含起始代码的项目。
  2. 在 Android 设备或模拟器上运行该应用。

现在,您可以开始编码了!

3. 使用 WorkManager 调度通知

除了调度提醒通知之外,Water Me! 应用的大部分功能都已经实现了。

用于发送通知的代码位于 WaterReminderWorker.kt 文件中,该文件位于 worker 软件包中。WaterReminderWorker 类扩展了 CoroutineWorker 类,用于发送通知的代码就是位于其 doWork() 方法内。

由于对您而言通知可能是一个新主题,所以此代码已经完成了。

override suspend fun doWork(): Result {

    val plantName = inputData.getString(nameKey)

    makePlantReminderNotification(
        applicationContext.resources.getString(R.string.time_to_water, plantName),
        applicationContext
    )

    return Result.success()
}

您的任务是创建一个 OneTimeWorkRequest,以便使用 WorkManagerWaterRepository 中的正确参数调用此方法。

如需更多帮助,请参阅使用 WorkManager 处理后台工作

创建工作请求

若要调度通知,您需在 WorkManagerWaterRepository.kt 文件中实现 scheduleReminder() 方法。

  1. 使用 Data.Builder 创建一个名为 data 的变量。data 需要由单个字符串值组成,其中 WaterReminderWorker.nameKey 是键,而传入 scheduleReminder()plantName 是值。
  2. 使用 WaterReminderWorker 类创建一次性工作请求。使用传入 scheduleReminder() 函数的 durationunit 将输入数据设为您创建的数据变量。
  3. 调用 workManagerenqueueUniqueWork() 方法。传入与时长串联的植物名称,使用 REPLACE 作为 ExistingWorkPolicy,并使用相应的工作请求对象。

现在,您的应用应该能按预期运行了。

4. 额外挑战(可选)

如需进行更多编码练习,请将时长选项改为:

  • 5 秒
  • 1 分钟
  • 2 分钟
  • 3 分钟

完成后,请测试每个时长,确认其能否按预期运行。

5. 获取解决方案代码

如需下载完成后的 Codelab 代码,可以使用以下命令:

$ git clone https://github.com/google-developer-training/basic-android-kotlin-compose-training-waterme.git
$ cd basic-android-kotlin-compose-training-waterme
$ git checkout main

或者,您也可以下载 ZIP 文件形式的代码库,将其解压缩并在 Android Studio 中打开。

如果您想查看此 Codelab 的解决方案代码,请前往 GitHub