연습: Water Me! 앱

1. 시작하기 전에

소개

이 단원에서는 지연 가능한 백그라운드 작업을 위한 Jetpack 라이브러리인 WorkManager에 관해 알아봤습니다. 이 백그라운드 작업은 소스 앱을 닫더라도 실행이 보장됩니다.

WorkManager에 관해 배우면서 Worker 클래스에서 작업을 정의하는 방법, Worker의 WorkRequest를 만드는 방법, 작업을 큐에 추가하고 예약하는 방법도 익혔습니다.

이번 연습에서는 학습한 개념을 활용하여 Water Me! 앱을 발전시켜 보겠습니다.

솔루션 코드는 마지막에 제공됩니다. 이러한 학습 경험을 최대한 활용하려면 제공된 솔루션 코드를 살펴보기 전에 최대한 많이 구현해 보고 문제를 해결해 보세요. 이러한 실습 시간을 통해 가장 많이 배울 수 있습니다.

기본 요건

필요한 항목

  • 인터넷 액세스가 가능하고 Android 스튜디오가 설치된 컴퓨터

빌드할 항목

이번 연습에서는 학습한 개념을 활용하여 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 스튜디오에서 시작 코드가 있는 프로젝트를 엽니다.
  2. Android 기기나 에뮬레이터에서 앱을 실행합니다.

이제 코딩을 시작할 준비가 되었습니다.

3. WorkManager를 사용하여 알림 예약

Water Me! 앱의 기능은 리마인더 알림을 예약하는 기능을 제외하고 거의 구현된 상태입니다.

알림을 만드는 코드는 worker 패키지에 있는 WaterReminderWorker.kt 파일에 있습니다. 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()
}

WorkManagerWaterRepository의 올바른 매개변수를 사용하여 이 메서드를 호출하는 OneTimeWorkRequest를 만들어야 합니다.

자세한 내용은 WorkManager로 백그라운드 작업을 참고하세요.

작업 요청 만들기

알림을 예약하려면 WorkManagerWaterRepository.kt 파일의 scheduleReminder() 메서드를 구현해야 합니다.

  1. Data.Builderdata라는 변수를 만듭니다. 데이터는 WaterReminderWorker.nameKey가 키이고 scheduleReminder()에 전달된 plantName이 값인 단일 문자열 값으로 구성되어야 합니다.
  2. WaterReminderWorker 클래스로 일회성 작업 요청을 만듭니다. scheduleReminder()에 전달된 durationunit을 사용하고 입력 데이터를 직접 만든 데이터 변수로 설정합니다.
  3. workManagerenqueueUniqueWork() 메서드를 호출합니다. 기간과 연결된 식물 이름을 전달하고 REPLACEExistingWorkPolicy로 사용한 상태로 작업 요청 객체를 사용합니다.

이제 앱이 올바르게 작동합니다.

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 스튜디오에서 열어도 됩니다.

이 Codelab의 솔루션 코드는 GitHub에서 확인하세요.