Edited at

Lollipop以降での通知(DroidKaigiアプリにContributeしたポイント)

More than 3 years have passed since last update.

過日、DroidKaigi 2016が開催され、@konifarさんの手により開発が始まった公式アプリも公開されました。

私も通知機能関係でいくつかPRを出したので、簡単にその解説をしてみます。


関連資料

私のPRはTechBoosterの同人誌にLollipopの通知の記事を書いた時に一通り調べた情報が元になっています。

機能概要だけ知るにはLT資料を読むといいです。


Pull Requests

アプリの基本的な通知機能設定機能punchdrunkerさんが実装されました。

更にLollipop以降の新しい通知関係のfeatureに対応させるためのPRを私が出しました。


Support Lollipop notification feature

https://github.com/konifar/droidkaigi2016/pull/228

以下の4点を実装するPRです。


■優先モードのためcategoryを設定する

LollipopでcategoryというフィールドがNotificationクラスに増えました。

端末が優先モードの場合、ユーザが設定したカテゴリの通知のみ通知音・バイブが行われます。

MarshmallowだとQuick Settingsで「優先する通知のみ」って表示されるモードです。

今回はCATEGORY_EVENTを設定しました。

ちなみに、メッセージや電話着のカテゴリの場合は、優先度の判定のためaddPersonメソッドで連絡先情報を通知に追加することも出来ます。

※同人誌の執筆当時、このモードを私は重要モードと訳していたのですが、今は日本語版公式ドキュメントがあり「優先」モードと記載されていたので合わせておきます。



※Lollipopでのスクリーンショット


■ロック画面に表示するためvisibilityを設定する

LollipopでvisibilityというフィールドがNotificationクラスに増えました。

端末の設定が「プライベートな通知内容を非表示にする」の場合、visibilityに応じてロック画面に表示する通知内容が切り替わります。

ロック画面でも確認できるよう今回はVISIBILITY_PUBLICを設定しました。

例えばメールの通知など、プライベートな情報が含まれる場合はVISIBILITY_PRIVATEまたはVISIBILITY_SECRETを設定するべきです。

VISIBILITY_PRIVATEの通知には公開用の別の通知を設定する事ができます。


■ヘッドアップ通知のためpriorityを設定する

Jelly BeanでpriorityというフィールドがNotificationクラスに増えていました。

Lollipopからはヘッドアップ通知を表示するかどうかの条件の1つとしてpriorityを使用します。

Androidは通知のpriorityがHIGH以上かつ着信音/バイブが設定されいるとヘッドアップ通知として表示します。

※別の条件として、fullScreenIntentの場合もヘッドアップ通知になります。

別のことに気を取られたりしていてもヘッドアップ通知でユーザが気付けるよう今回はPRIORITY_HIGHを設定しました。


■ヘッドアップ通知のON/OFFのため設定画面へ項目を追加

ヘッドアップ通知はユーザに確実に重要な情報を知らせるために有用ですが、かなり煩わしいです。

そこで、ヘッドアップ通知のON/OFFをする設定項目を追加しました。

実装上は、設定内容にあわせてpriorityに設定する値を切り替えているだけです。

ただし、この実装がいいかというとそうではありません。この辺はヘッドアップ通知の闇っぽい所だと思ってます。

今回のアプリはエンジニアが使うものなので、ヘッドアップ通知という用語で設定項目を表現し簡単に済ませてあります。

設定項目をちゃんと作るなら着信音・バイブのそれぞれのON/OFFを作るべきですが、一方でエンドユーザは「priorityがHIGH以上かつ着信音/バイブが設定されいる」なんて条件わかりませんし、ヘッドアップ通知なんて名前も知ったこっちゃありません。

Marshmallowで本体設定側にある個々のアプリ別のヘッドアップ通知ON/OFF項目は、「通知の瞬間表示を許可」「現在の画面で特定の通知をスライド表示することをこのアプリに許可する」なんて表記になっていて、苦しい感じが伝わってきます。

私が勉強不足なだけで、この辺のベストプラクティスがもうあったりしたらすみません。


Support NOTIFICATION_PREFERENCES intent category.

https://github.com/konifar/droidkaigi2016/pull/289

LollipopでNOTIFICATION_PREFERENCESというintentカテゴリが増えました。

通知の設定画面activityのintent-filterにこのカテゴリを設定しておくと、通知を長押しした時に設定画面へ遷移する歯車アイコンが表示されるようになります。

今回のアプリは設定画面を個別のActivityにせずFragmentとして作っていたので、MainActivityのonCreateでintentの内容を見て表示するFragmentを切り替えるようにしました。

この機能、開発ドキュメントあたりには全く載っていなくて、クラスリファレンスにしれっと定数が追加されているだけでした。クラスのdiff見てなければ絶対知らないままだった…


Set accent color to notifications.

https://github.com/konifar/droidkaigi2016/pull/326

LollipopでcolorというフィールドがNotificationクラスに増えました。

Lollipopから通知アイコンは白単色が強制されるようになりましたが、colorを設定しておくと通知ドロワ内で表示される通知アイコンの周囲の色を変更できます。

今回はDroidKaigi 2016のテーマ色を設定しました。


その他

ロック画面にメディア再生コントロールが表示されなくなった替わりにMediaStyleなんてのが増えていたり、tickerTextの役割が変わったりしています。

関連資料も見てみてください。