1. 准备工作
此 Codelab 将介绍如何自行构建一个名为 Water Me 的新应用,并且会逐步引导您在 Android Studio 完成 Water Me 应用项目,包括项目设置和测试。
前提条件
- 此项目适合已学完《使用 Kotlin 进行 Android 开发的基础知识》课程第 6 单元的学生。
构建内容
- 在现有应用中使用自定义
Worker
调度通知。
所需条件
- 一台安装了 Android Studio 的计算机。
2. 已完成的应用概览
Water Me! 应用包含一份植物列表、一些关于植物的信息以及每种植物浇水频率需求的说明。对于每种植物,已完成的应用都会安排提醒来提示何时为它们浇水。
提醒会以通知形式在设备上显示,即使 Water Me! 应用未运行也会显示。点按通知会启动 Water Me! 应用。
为了实现此功能,您的任务是使用显示通知的自定义 Worker
来调度后台任务。
3. 开始
下载项目代码
请注意,文件夹名称为 android-basics-kotlin-water-me-app
。在 Android Studio 中打开项目时,请选择此文件夹。
如需获取此 Codelab 的代码并在 Android Studio 中打开它,请执行以下操作。
获取代码
- 点击提供的网址。此时,项目的 GitHub 页面会在浏览器中打开。
- 在项目的 GitHub 页面上,点击 Code 按钮,这时会出现一个对话框。
- 在对话框中,点击 Download ZIP 按钮,将项目保存到计算机上。等待下载完成。
- 在计算机上找到该文件(很可能在 Downloads 文件夹中)。
- 双击 ZIP 文件进行解压缩。系统将创建一个包含项目文件的新文件夹。
在 Android Studio 中打开项目
- 启动 Android Studio。
- 在 Welcome to Android Studio 窗口中,点击 Open an existing Android Studio project。
注意:如果 Android Studio 已经打开,请依次选择 File > New > Import Project 菜单选项。
- 在 Import Project 对话框中,前往解压缩的项目文件夹所在的位置(很可能在 Downloads 文件夹中)。
- 双击该项目文件夹。
- 等待 Android Studio 打开项目。
- 点击 Run 按钮 以构建并运行应用。请确保该应用按预期构建。
- 在 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()
方法。
- 使用
Data.Builder
创建名为data
的变量。data 应由单个字符串值组成,其中WaterReminder.Worker.nameKey
是键,而传入scheduleReminder()
的plantName
是值。 - 使用
WaterReminderWorker
创建一次性工作请求,在此过程中要用到传入scheduleReminder()
函数的delay
和unit
,并且要设置输入到您创建的data
变量的数据。 - 调用
workManager
的enqueueUniqueWork()
方法,传入植物名称,使用REPLACE
作为ExistingWorkPolicy
,并调用工作请求。
您的应用现在应该会按预期运行。由于每条提醒需要很长时间才能显示,我们建议您运行包含的测试,以验证通知是否能按预期运行。
5. 测试说明
运行测试
如需运行测试,您可以执行以下任一操作。
对于单个测试用例,打开测试用例类,并点击类声明左侧的绿色箭头。然后,从菜单中选择“Run”选项。这样会运行测试用例中的所有测试。
很多时候您可能只需要运行单个测试,例如,其他测试都通过了,只有一个测试失败。您可以像运行整个测试用例一样运行单个测试。点击绿色箭头并选择 Run 选项。