プロジェクト: 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. 指定された URL をクリックします。プロジェクトの GitHub ページがブラウザで開きます。
  2. プロジェクトの GitHub ページで、[Code] ボタンをクリックすると、ダイアログが表示されます。

5b0a76c50478a73f.png

  1. ダイアログで、[Download ZIP] をクリックして、プロジェクトをパソコンに保存します。ダウンロードが完了するまで待ってください。
  2. パソコンに保存したファイルを見つけます([ダウンロード] フォルダなど)。
  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] ダイアログで、展開したプロジェクト フォルダがある場所([ダウンロード] フォルダなど)に移動します。
  2. そのプロジェクト フォルダをダブルクリックします。
  3. Android Studio でプロジェクトが開くまで待ちます。
  4. 実行ボタン 11c34fc5e516fb1c.png をクリックし、アプリをビルドして実行します。正常にビルドされたことを確認します。
  5. [Project] ツール ウィンドウでプロジェクト ファイルを見て、アプリがどのように設定されているかを確認します。

4. WorkManager を使用して通知をスケジュール設定する

Water Me! アプリの機能は、スケジュール設定する部分と通知を除き、すべて実装済みです。通知を表示するコードは、WaterReminderWorker.ktworker パッケージ)にあります。これは、カスタムの 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.ktscheduleReminder() メソッドを実装する必要があります。

  1. Data.Builder を使用して data という変数を作成します。data は単一の文字列値で構成され、WaterReminder.Worker.nameKey がキーで、scheduleReminder() に渡される plantName が値である必要があります。
  2. WaterReminderWorker を使用して、1 回限りの処理リクエストを作成します。これには、scheduleReminder() 関数に渡された delayunit を使用して、入力データを作成した data 変数に設定します。
  3. workManagerenqueueUniqueWork() メソッドを呼び出して、植物名を渡し、REPLACEExistingWorkPolicy として使用し、処理リクエストを行います。

これで、アプリは想定どおりに動作するはずです。各リマインダーが表示されるまでには時間が長くかかるため、付属のテストを実行して、通知が想定どおりに機能するか確認することをおすすめします。

5. テスト手順

テストを実行する

テストを実行するには、次のいずれかを行います。

1 つのテストケースの場合、テストケース クラスを開き、クラス宣言の左側にある緑色の矢印をクリックします。メニューから [Run] オプションを選択します。これにより、テストケース内のすべてのテストが実行されます。

a32317d35c77142b.png

多くの場合、1 つのテストを実行するだけで済みます。たとえば、失敗したテストが 1 つしかなく、他のテストには合格している場合などです。テストケース全体を実行するときと同じように、1 つのテストを実行できます。緑色の矢印をクリックして [Run] オプションを選択します。

ac6244434cfafb60.png