お知らせなどのプッシュ通知の実装は、ユーザービリティなどを考慮すると、非常にセンシティブな要件項目です。情報を出したいお客様は、時に過度な情報送信を主張されますが、それがお客様の目的と合致するかというと、必ずしもそうではない…というか、私の経験上は、どちらかというと間違った選択であることが多いですね。ディレクションにおいてはお客様とよく相談し、お客様にプッシュ通知の利害をよく説明し、ご理解いただくこと、またご理解頂けるように説明する能力が、制作会社にも求められると思います。
さて、例えば目覚まし時計などのように、通知されること自体が、ユーザーがアプリケーションに求める主たる機能である場合を除いては、コントローラブル(ON/OFF可能)であること、かつ「あまりうるさく無い」こと、といったあたりが良い落としどころのようです。
今回は、先日制作したアプリケーションについて、その仕様検討・実装のメモを残しておきます。
通知仕様の検討
アプリケーションの概要
まず、アプリケーションの要件は次のような感じでした。
- 定期的に電力会社の情報をチェックする
- 電力不足になると、ユーザーに通知する
アプリケーションの目的は、「節電」です。ユーザーはアプリケーションをインストールすることで、節電の為の行動を促される仕組みを持っています。通知は、電力不足の傾向が高まった時にそれをユーザーに知らせて、さらなる節電を促すものです。
ユーザー特性
今回、ユーザーには次のような特性があると推定しました。
- 能動的に節電に取り組む意思がある
- ある程度頻繁な通知も、許容される可能性が高い
- 通知はなるべくタイムリーに欲しいと考えている
- 電池消費の多いアプリは困る
- 過度な通知を嫌う
検討
これをもとに、次のような検討をしました。
- どんなふうに通知するか? 画面表示だけで良いか?
…音声やバイブレーションでの通知は過剰ではないか? - 画面表示だけの通知なら、お知らせは画面ONの時だけで良くないか?
…OFFの時はどっちみち見えないし - じゃ逆に、画面OFFの時は、電力チェックしなくて良い
…電池節約できる - 最低チェック間隔は必要か?
…頻繁に画面ON/OFFする人もいると思われる - 電源つないでデスクトップに置いてる人もいるよね?
…画面ONの時だけじゃしばらくお知らせ出ないから、画面ON時は定期的なポーリングが必要 - 通知のON/OFFは必須
決定された仕様
以上から、結果的に以下の通知仕様とすることになりました。
- 通知方法
- Notificationで表示する
- 音やバイブレーションでの通知はしない
- 次回の電力チェックで通知要件が無くなったらNotificationをキャンセルする
- 電力チェックのタイミング
- スクリーンON時、電力チェックする
- 最低チェック間隔を設けて、過度な電力チェックをスキップ
- スクリーンON中、定期的にポーリングして、電力チェックする
- ポーリング間隔は、電力会社の情報更新間隔と合わせる
実装メモ
今回は上記の仕様を満たす為に、以下のような実装を行いました。
- BroadcastReceiver
- android.intent.action.SCREEN_ON
- bindService して、サービスの checkAndNotify() でチェックして必要なら通知
- Alarmで次回の定期チェックをセット
- android.intent.action.SCREEN_OFF
- Alarmをクリア
- android.intent.action.BOOT_COMPLETED
- android.intent.action.PACKAGE_CHANGED
- SCREEN_ON/OFF 用の IntentFilter を登録(これらは動的にしか登録できないから)
- android.intent.action.SCREEN_ON
- Service
- checkAndNotify
- 前回チェック時間を確認、最低チェック間隔を超えていたら:
- 別 Thread でチェック~必要なら通知
- 前回チェック時間として現在時間を保存(Preference)
- 前回チェック時間を確認、最低チェック間隔を超えていたら:
- checkAndNotify