프로젝트: Water Me! 앱

1. 시작하기 전에

이 Codelab에서는 개발자가 직접 빌드할 Water Me라는 새로운 앱을 소개합니다. Android 스튜디오 내에서의 프로젝트 설정 및 테스트를 비롯하여 Water Me 앱 프로젝트를 완료하는 단계를 안내합니다.

기본 요건

  • 이 프로젝트는 Kotlin으로 배우는 Android 기본사항 과정의 6단원을 완료한 학습자를 대상으로 합니다.

빌드할 항목

  • 기존 앱에서 맞춤 Worker를 사용하여 알림을 예약합니다.

준비물

  • Android 스튜디오가 설치된 컴퓨터

2. 완성된 앱 개요

Water Me! 앱은 식물 목록과 식물 정보, 식물마다 물을 줘야 하는 빈도 설명으로 구성됩니다. 완성된 앱에서는 각 식물에 물을 줘야 하는 시기를 알려주는 리마인더를 예약할 수 있습니다.

90be029855bc3111.png

리마인더는 Water Me! 앱이 실행되고 있지 않더라도 기기에 알림으로 표시됩니다. 알림을 탭하면 Water Me! 앱이 실행됩니다.

df244d6749f69085.png

이 기능이 작동하려면 알림을 표시하는 맞춤 Worker를 사용하여 백그라운드 작업을 예약해야 합니다.

3. 시작하기

프로젝트 코드 다운로드

폴더 이름은 android-basics-kotlin-water-me-app입니다. Android 스튜디오에서 프로젝트를 열 때 이 폴더를 선택하세요.

이 Codelab의 코드를 가져와서 Android 스튜디오에서 열려면 다음을 실행합니다.

코드 가져오기

  1. 제공된 URL을 클릭합니다. 브라우저에서 프로젝트의 GitHub 페이지가 열립니다.
  2. 프로젝트의 GitHub 페이지에서 Code 버튼을 클릭하여 대화상자를 엽니다.

5b0a76c50478a73f.png

  1. 대화상자에서 Download ZIP 버튼을 클릭하여 컴퓨터에 프로젝트를 저장합니다. 다운로드가 완료될 때까지 기다립니다.
  2. 컴퓨터에서 파일을 찾습니다(예: Downloads 폴더).
  3. ZIP 파일을 더블클릭하여 압축을 해제합니다. 프로젝트 파일이 포함된 새 폴더가 만들어집니다.

Android 스튜디오에서 프로젝트 열기

  1. Android 스튜디오를 시작합니다.
  2. Welcome to Android Studio 창에서 Open an existing Android Studio project를 클릭합니다.

36cc44fcf0f89a1d.png

참고: Android 스튜디오가 이미 열려 있는 경우 File > New > Import Project 메뉴 옵션을 대신 선택합니다.

21f3eec988dcfbe9.png

  1. Import Project 대화상자에서 압축 해제된 프로젝트 폴더가 있는 위치로 이동합니다(예: Downloads 폴더).
  2. 프로젝트 폴더를 더블클릭합니다.
  3. Android 스튜디오가 프로젝트를 열 때까지 기다립니다.
  4. Run 버튼 11c34fc5e516fb1c.png을 클릭하여 앱을 빌드하고 실행합니다. 예상대로 작동하는지 확인합니다.
  5. Project 도구 창에서 프로젝트 파일을 살펴보고 앱이 설정된 방식을 확인합니다.

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

Water Me! 앱의 모든 기능은 예약할 부분과 알림을 제외하고 이미 구현되어 있습니다. 알림을 표시하는 코드는 worker 패키지의 WaterReminderWorker.kt에 있습니다. 맞춤 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()
}

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

작업 요청 만들기

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

  1. Data.Builder를 사용하여 data라는 변수를 만듭니다. 데이터는 WaterReminder.Worker.nameKey가 키이고 scheduleReminder()에 전달된 plantName이 값인 단일 문자열 값으로 구성되어야 합니다.
  2. WaterReminderWorkerscheduleReminder() 함수에 전달된 delayunit을 사용하고 입력 데이터를 직접 만든 data 변수로 설정하여 일회성 작업 요청을 만듭니다.
  3. workManagerenqueueUniqueWork() 메서드를 호출하여 식물 이름(REPLACEExistingWorkPolicy로 사용)과 작업 요청을 전달합니다.

이제 앱이 올바르게 작동합니다. 각 리마인더가 표시되는 데는 시간이 오래 걸리므로 포함된 테스트를 실행하여 알림이 올바르게 작동하는지 확인하는 것이 좋습니다.

5. 테스트 안내

테스트 실행

테스트를 실행하려면 다음 중 하나를 실행하면 됩니다.

단일 테스트 사례의 경우 테스트 사례 클래스를 열고 클래스 선언 왼쪽의 녹색 화살표를 클릭합니다. 그런 다음 메뉴에서 실행 옵션을 선택하면 됩니다. 그러면 테스트 사례의 테스트가 모두 실행됩니다.

a32317d35c77142b.png

예를 들어 실패한 테스트는 하나뿐이고 나머지 테스트는 통과된 경우와 같이 단일 테스트만 실행하려는 때가 많습니다. 전체 테스트 사례와 마찬가지로 단일 테스트를 실행할 수 있습니다. 녹색 화살표를 사용하여 실행 옵션을 선택합니다.

ac6244434cfafb60.png