项目:Water Me! 应用

1. 准备工作

此 Codelab 将介绍如何自行构建一个名为 Water Me 的新应用,并且会逐步引导您在 Android Studio 完成 Water Me 应用项目,包括项目设置和测试。

前提条件

  • 此项目适合已学完《使用 Kotlin 进行 Android 开发的基础知识》课程第 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 中打开项目时,请选择此文件夹。

如需获取此 Codelab 的代码并在 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 的变量。data 应由单个字符串值组成,其中 WaterReminder.Worker.nameKey 是键,而传入 scheduleReminder()plantName 是值。
  2. 使用 WaterReminderWorker 创建一次性工作请求,在此过程中要用到传入 scheduleReminder() 函数的 delayunit,并且要设置输入到您创建的 data 变量的数据。
  3. 调用 workManagerenqueueUniqueWork() 方法,传入植物名称,使用 REPLACE 作为 ExistingWorkPolicy,并调用工作请求。

您的应用现在应该会按预期运行。由于每条提醒需要很长时间才能显示,我们建议您运行包含的测试,以验证通知是否能按预期运行。

5. 测试说明

运行测试

如需运行测试,您可以执行以下任一操作。

对于单个测试用例,打开测试用例类,并点击类声明左侧的绿色箭头。然后,从菜单中选择“Run”选项。这样会运行测试用例中的所有测试。

a32317d35c77142b.png

经常会有您只想运行单个测试的情况,例如,有一个测试失败,而其他测试都通过。您可以像运行整个测试用例一样运行单个测试。点击绿色箭头并选择 Run 选项。

ac6244434cfafb60.png