练习: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() 函数的 duration 和 unit 将输入数据设为您创建的数据变量。
  3. 调用 workManager 的 enqueueUniqueWork() 方法。传入与时长串联的植物名称,使用 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。