アプリ開発日誌
2016.07.20
【Android】通知をカスタマイズしよう!
どうも、アンドロイド開発担当ワタナベです。
アプリの要件として、アプリがバックグラウンドにあったり、起動していない時にユーザーにリマインドしたい情報やお知らせ通知があることもあるでしょう。Android端末ではそういった要望を叶えるために、[Notification]という機能を使用して実装し、通知を行います。サーバーからのプッシュ通知の表示で、見かけたことがあると思いますが、プッシュ通知以外でも起動時にバックグラウンドで実行する処理を行い、時間が経ったら通知させる、といったことも可能です。目覚ましなどはこの機能をしていると思われます。そんな通知の仕方を工夫することでユーザーがアプリを使う機会を増やすことができるでしょう。
今回はそんな便利な通知をただ表示するだけではなく、スタイルやイベント、バイブレーションやサウンドをといったカスタマイズをしてみましょう。(今回のサンプルアプリはGithubにプッシュしていますのでよろしければどうぞ)
一般的な通知方法
まずは一般的な通知の実装方法です。

private void normalNotification() {
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setContentTitle("タイトル");
builder.setContentText("内容");
builder.setContentInfo("情報欄");
builder.setTicker("通知概要");
NotificationManager manager =
(NotificationManager) getSystemService(Service.NOTIFICATION_SERVICE);
manager.notify(0, builder.build());
}
大きなアイコンで表示する

private void bigIconNotification() {
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setContentTitle("大きいアイコンで通知");
// 大きいアイコンを表示するためにBitmapを設定する
Bitmap bigIcon = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
builder.setLargeIcon(bigIcon);
NotificationManager manager = (NotificationManager)
getSystemService(Service.NOTIFICATION_SERVICE);
manager.notify(0, builder.build());
}
タップしてアプリを起動する
通知をタップしてアプリを起動することができるとよりユーザーにとって使い勝手のいいアプリとなります。タップを契機のアプリを起動したい場合の実装方法です。
private void launcherAppNotification() {
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setContentTitle("タップでアプリを起動する");
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(
mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendingIntent);
builder.setAutoCancel(true);
NotificationManager manager = (NotificationManager)
getSystemService(Service.NOTIFICATION_SERVICE);
manager.notify(0, builder.build());
}
通知オプションを設定する
通知する際にバイブレーションやOSデフォルトのサウンドを鳴らしたい場合の実装方法です。
private void setDefaultsNotification(EnNotification notification) {
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSmallIcon(R.mipmap.ic_launcher);
switch (notification) {
case VIBRATION:
builder.setContentTitle("VIBRATION");
builder.setDefaults(Notification.DEFAULT_VIBRATE);
break;
case SOUND:
builder.setContentTitle("SOUND");
builder.setDefaults(Notification.DEFAULT_SOUND);
break;
case ALL:
builder.setContentTitle("ALL");
builder.setDefaults(Notification.DEFAULT_ALL);
break;
}
builder.setWhen(System.currentTimeMillis());
NotificationManager manager = (NotificationManager)
getSystemService(Service.NOTIFICATION_SERVICE);
manager.notify(0, builder.build());
}
スタイルを設定する
表示領域に余裕がある場合はスタイルを設定することで通知を目立たせることができます。しかし、主張の強い通知はユーザーに嫌われることもありますので、そのスタイルがアプリの機能にマッチしているか検討することをお勧めします。PictureStyleでは写真を主に扱うアプリで用いられているのを見かけますね。

private void bigTextStyleNotification() {
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
builder.setSmallIcon(R.mipmap.ic_launcher);
// スタイル設定
NotificationCompat.BigTextStyle bigTextStyle =
new NotificationCompat.BigTextStyle(builder);
bigTextStyle.setBigContentTitle("BigTextStyle");
bigTextStyle.bigText("コンテンツサンプルコンテンツサンプル");
bigTextStyle.setSummaryText("通知サマリテキスト");
NotificationManager manager = (NotificationManager)
getSystemService(Service.NOTIFICATION_SERVICE);
manager.notify(0, builder.build());
}
private void pictureStyleNotification() {
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
builder.setSmallIcon(R.mipmap.ic_launcher);
// スタイル設定
NotificationCompat.BigPictureStyle bigPictureStyle =
new NotificationCompat.BigPictureStyle(builder);
Bitmap largePicture = BitmapFactory.decodeResource(
getResources(), R.mipmap.ic_launcher);
bigPictureStyle.bigPicture(largePicture);
bigPictureStyle.setBigContentTitle("BigPictureStyle");
bigPictureStyle.setSummaryText("通知サマリテキスト");
NotificationManager manager = (NotificationManager)
getSystemService(Service.NOTIFICATION_SERVICE);
manager.notify(0, builder.build());
}
まとめ
今回はNotificationの機能を使って通知をカスタマイズする方法をまとめました。
通知はユーザーがアプリを使う機会を増やすので、要件に含まれることがとても多い機能です。
通知はユーザーの注意を奪いますが、適切な頻度を見誤るとストレスを与えてしまい、最悪の場合アプリがアンインストールされる原因にもなります。ユーザーの心理をよく読み、用法用量正しく通知しましょう。