はじめに

Android O いじってますか?
Developer Preview 1 版がリリースされたのがつい先月ですので、「ガンガンいじってるぜ!」という方は、まだそれほど多くはいらっしゃらないと思います。

今回は、そんな生まれたての Android O の新機能である、通知チャンネル(Notification Channel) についてご紹介したいと思います。

本記事は、2017年 3月に公開された Developer Preview 1 時点での情報を元に作成しております。 今回ご紹介した内容は、正式版のリリースまでに変更される可能性があることにご注意ください。 最新の情報は公式ドキュメントをご覧ください。

通知チャンネル (Notification Channel) とは何か

Notification Channel とは、 Android O から導入された新機能の一つです。

開発者は、複数のチャンネルを作り、個々の通知を任意のチャンネルに割り振ることによって、重要度や通知音などの属性を一括で指定することができます。

ユーザの視点から見ると、バイブレーションやマナーモードをオーバライドするか、などといった設定を、チャンネルレベルで行うことができます。

実際のシステムの「設定」アプリの画面がこちらです。

設定アプリ

これらの設定は、今までは、アプリ単位でしか行えなかったため、「広告のような通知は拒否して、実際的な通知は受け取る」といった設定が不可能でした。

ところが、 Notification Channel の登場によって、例えば、「広告チャンネルはブロックし、必要なチャンネルのみを購読する」といったようなことが可能になります。(あくまで、そのアプリが適切にチャンネルを分けていればの話ですが…)

また、targetSdkVersion で O 以上を指定してビルドする場合には、このチャンネルを一つ以上作成しないと、ユーザに通知が表示されなくなってしまうらしいので、ご注意ください。
O より前のバージョンをターゲットとしてビルドしたアプリを、O のユーザがインストールした場合はこの制限を気にする必要はありません。

通知チャンネルを作る

それでは、実際にチャンネルを作ってみましょう。

NotificationManager manager = (NotificationManager)
        getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channel = new NotificationChannel(
                // アプリでユニークな ID
                "channel_1",
                // ユーザが「設定」アプリで見ることになるチャンネル名
                getString(R.string.channel_name),
                // チャンネルの重要度(0 ~ 4)
                NotificationManager.IMPORTANCE_DEFAULT
);
// 通知時のライトの色
channel.setLightColor(Color.GREEN);
// ロック画面で通知を表示するかどうか
channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
// 端末にチャンネルを登録し、「設定」で見れるようにする
manager.createNotificationChannel(channel);

コメントで解説を書きましたが、簡単な流れを追ってみましょう。

まず、NotificationManager のインスタンスを取得します。
これは以前と変わりありません。

次に、NotificationChannel のインスタンスを作成します。
第二引数で渡している文字列ですが、これがユーザの目に入るチャンネル名となりますので、Context#getString などで、適切に取得した(多言語対応した)文字列を指定しましょう。

そのあとに、通知時のライトの色と、ロック画面で表示するかどうかを指定しています。これらの属性は、のちにこのチャンネルに登録される Notification に引き継がれます。
O 以降では、Notification.BuildersetLights など、NotificationChannel で指定できる属性を指定するためのメソッド群が軒並み deprecated になります。
これは、上述の重要度 (setPriority) なども同じなので、注意してください。

最後に、作ったチャンネルを NotificationManager に登録しています。

この登録を行わない限り、 Android 側は、このアプリがどのような通知チャンネルを持っているかを知るすべがないため、「設定」アプリに、チャンネルが表示されません。そのため、チャンネルの登録処理は、アプリの起動時に行うのが適切でしょう。

通知をチャンネルに投稿する

早速、作ったチャンネルに通知を投稿してみましょう。

NotificationManager manager = (NotificationManager)
        getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification.Builder(this)
                .setContentTitle("通知タイトル")
                .setContentText("通知コンテンツ")
                .setSmallIcon(R.drawable.ic_notify)
                .setChannel("channel_1")
                .build();
manager.notify(1, notification);

Notification.Builder に、setChannel(String) というメソッドをコールしています。これによって、この通知をチャンネルに紐づけることができます。

チャンネル ID は、次のように Builder のコンストラクタに渡すこともできます。

Notification notification = new Notification.Builder(this, "channel_1")

このようにしてチャンネルに紐づけられた通知は、上述の通り、重要度などのチャンネルの属性を引き継ぐことになります。

どのようなチャンネルを作り、それに何を紐づけるか、ちょっとしたところですが、開発者のセンスが問われるところですね。

終わりに

今回は Android O の新機能である通知チャンネル( Notification Channel )について見てきました。O の通知には、これ以外にも様々な機能が追加されているので、近日中にまたご紹介したいと思います。
公式のドキュメントは、すでに日本語対応していますので、そちらも合わせてご覧いただくと、より理解が深まるかと思います。