演習: Water Me! アプリ

1. 始める前に

はじめに

このユニットでは、遅延可能なバックグラウンド処理用の Jetpack ライブラリである WorkManager について学習しました。このバックグラウンド処理は、ソースアプリを閉じても必ず実行されます。

WorkManager について学習しながら、Worker クラスで処理を定義する方法、Worker の WorkRequest を作成する方法、処理をキューに登録してスケジュール設定する方法を学びました。

この演習セットでは、学習したコンセプトを活用して Water Me! アプリを拡張します。

解答コードは最後にあります。この学習体験を最大限に活用するため、記載された解答コードを確認する前に、できる限りご自身で実装とトラブルシューティングを行ってみてください。この実践時間中に、多くのことを学びましょう。

前提条件

必要なもの

  • Android Studio がインストールされた、インターネットに接続できるパソコン。

作成するアプリの概要

この演習セットでは、学習したコンセプトを活用して 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

Water Me! アプリのコードは、こちらの GitHub リポジトリで確認できます。

スターター コードを実行する

次の手順でスターター コードを確認し、よく理解してください。

  1. Android Studio でスターター コードのプロジェクトを開きます。
  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.Builder を使用して、data という変数を作成します。データは単一の文字列値(WaterReminderWorker.nameKey がキーで、scheduleReminder() に渡される plantName が値)で構成する必要があります。
  2. WaterReminderWorker クラスを使用して 1 回限りの処理リクエストを作成します。scheduleReminder() 関数に渡された durationunit を使用して、作成するデータ変数に入力データを設定します。
  3. workManagerenqueueUniqueWork() メソッドを呼び出します。植物名に経過時間を連結して渡し、ExistingWorkPolicy および処理リクエスト オブジェクトとして REPLACE を使用します。

これで、アプリは想定どおりに動作するはずです。

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 Studio で開くこともできます。

この Codelab の解答コードを確認する場合は、GitHub で表示します。