The Android Developer Challenge is back! Submit your idea before December 2.

展開可能な通知を作成する

基本的な通知には通常、タイトルやテキスト行のほか、それに対してユーザーが行える操作を表示します。さらに詳細な情報を提供するには、このページに記載した通知テンプレートのいずれかを適用して、展開可能な大型の通知を作成することもできます。

はじめに、通知を作成する方法で説明しているように、基本的なコンテンツをすべて含めた通知を作成します。次に、以下に示すように、スタイル オブジェクトを指定して setStyle() を呼び出し、各テンプレートに対応する情報を設定します。

大きな画像を追加する

通知に画像を追加するには、NotificationCompat.BigPictureStyle のインスタンスを setStyle() に渡します。

Kotlin

    var notification = NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_post)
            .setContentTitle(imageTitle)
            .setContentText(imageDescription)
            .setStyle(NotificationCompat.BigPictureStyle()
                    .bigPicture(myBitmap))
            .build()
    

Java

    Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_post)
            .setContentTitle(imageTitle)
            .setContentText(imageDescription)
            .setStyle(new NotificationCompat.BigPictureStyle()
                   .bigPicture(myBitmap))
            .build();
    

通知が折りたたまれている間(図 1 に示すように)サムネイルのみ表示するには、setLargeIcon() を呼び出して画像を渡しますが、BigPictureStyle.bigLargeIcon() も呼び出して null を渡し、通知が展開されたときにその大きなサムネイルが表示されないようにします。

Kotlin

    var notification = NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_post)
            .setContentTitle(imageTitle)
            .setContentText(imageDescription)
            .setLargeIcon(myBitmap)
            .setStyle(NotificationCompat.BigPictureStyle()
                    .bigPicture(myBitmap)
                    .bigLargeIcon(null))
            .build()
    

Java

    Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_post)
            .setContentTitle(imageTitle)
            .setContentText(imageDescription)
            .setLargeIcon(myBitmap)
            .setStyle(new NotificationCompat.BigPictureStyle()
                    .bigPicture(myBitmap)
                    .bigLargeIcon(null))
            .build();
    

図 1. 通知と使用するスタイル: NotificationCompat.BigPictureStyle

大きなテキスト ブロックを追加する

NotificationCompat.BigTextStyle を適用して、通知を展開したコンテンツ領域にテキストを表示します。

Kotlin

    var notification = NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_mail)
            .setContentTitle(emailObject.getSenderName())
            .setContentText(emailObject.getSubject())
            .setLargeIcon(emailObject.getSenderAvatar())
            .setStyle(NotificationCompat.BigTextStyle()
                    .bigText(emailObject.getSubjectAndSnippet()))
            .build()
    

Java

    Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_mail)
            .setContentTitle(emailObject.getSenderName())
            .setContentText(emailObject.getSubject())
            .setLargeIcon(emailObject.getSenderAvatar())
            .setStyle(new NotificationCompat.BigTextStyle()
                    .bigText(emailObject.getSubjectAndSnippet()))
            .build();
    

図 2. 通知と使用するスタイル: NotificationCompat.BigTextStyle

ヒント: テキストのフォーマット(太字、斜体、改行など)を指定するには、HTML マークアップでスタイルを設定します。

受信トレイスタイルの通知を作成する

NotificationCompat.InboxStyle を通知に適用すると、受信メールからの抜粋など、概要を示す行を複数表示することができます。それにより、複数のコンテンツ テキストからそれぞれ 1 行だけ表示することができます。NotificationCompat.BigTextStyle が提供する連続したテキスト行そのままではなく抜粋します。

新しい行を追加するには、addLine() を 6 回まで呼び出せます。6 行より多く追加しても、最初の 6 行しか表示されません。

Kotlin

    var notification = NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_mail)
            .setContentTitle("5 New mails from " + sender.toString())
            .setContentText(subject)
            .setLargeIcon(aBitmap)
            .setStyle(NotificationCompat.InboxStyle()
                    .addLine(messageSnippet1)
                    .addLine(messageSnippet2))
            .build()
    

Java

    Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_mail)
            .setContentTitle("5 New mails from " + sender.toString())
            .setContentText(subject)
            .setLargeIcon(aBitmap)
            .setStyle(new NotificationCompat.InboxStyle()
                    .addLine(messageSnippet1)
                    .addLine(messageSnippet2))
            .build();
    

ヒント: 各行でメッセージの件名とメッセージを区別するには、HTML マークアップでスタイルを設定します(たとえば、件名を太字にします)。

通知に会話を表示する

NotificationCompat.MessagingStyle を適用すると、複数の人からの一連のメッセージを表示できます。人数の制限はありません。これは、各メッセージを一貫したレイアウトで表示できるので、メッセージ アプリに最適です。この場合、送信者の名前とメッセージのテキストを別々に扱い、各メッセージを複数行に渡って表示します。

新しいメッセージを追加するには、addMessage() 呼び出して、メッセージ テキスト、受信日時、送信者名を渡します。この情報を NotificationCompat.MessagingStyle.Message オブジェクトとして渡すこともできます。

Kotlin

    var message1 = NotificationCompat.MessagingStyle.Message(messages[0].getText(),
            messages[0].getTime(),
            messages[0].getSender())
    var message2 = NotificationCompat.MessagingStyle.Message(messages[1].getText(),
            messages[1].getTime(),
            messages[1].getSender())
    var notification = NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_message)
            .setStyle(NotificationCompat.MessagingStyle(resources.getString(R.string.reply_name))
                    .addMessage(message1)
                    .addMessage(message2))
            .build()
    

Java

    NotificationCompat.MessagingStyle.Message message1 =
            new NotificationCompat.MessagingStyle.Message(messages[0].getText(),
                                                          messages[0].getTime(),
                                                          messages[0].getSender());
    NotificationCompat.MessagingStyle.Message message2 =
            new NotificationCompat.MessagingStyle.Message(messages[1].getText(),
                                                          messages[1].getTime(),
                                                          messages[1].getSender());

    Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_message)
            .setStyle(new NotificationCompat.MessagingStyle(resources.getString(R.string.reply_name))
                    .addMessage(message1)
                    .addMessage(message2))
            .build();
    

図 3. 通知と使用するスタイル: NotificationCompat.MessagingStyle

必要であれば、setConversationTitle() を呼び出して会話の上に表示するタイトルを追加できます。ユーザーが作成したグループ名や、特に名前がなければ会話の参加者のリストなどをタイトルにすることが考えられます。1 対 1 のチャットの会話にはこのタイトルを設定しないでください。このフィールドが指定されているかどうかをヒントに、会話がグループかどうかをシステムが判断するからです。

このスタイルは、Android 7.0(API レベル 24)以上を稼働するデバイスにのみ適用されます。上記の例のように互換性ライブラリ(NotificationCompat)を使用する場合、MessagingStyle を指定した通知には自動的に、サポートされている展開通知スタイルが代替となります。

チャットの会話についてこのような通知を作成する場合は、ダイレクト返信操作を追加することも必要です。

メディア コントロールを備えた通知を作成する

NotificationCompat.MediaStyle を適用すると、メディアの再生コントロールとトラック情報を表示できます。

addAction() を最大 5 回呼び出して、最大 5 つの別個のアイコンボタンを表示できます。アルバムのアートワークを設定するには、setLargeIcon() を呼び出します。

他の通知スタイルとは異なり、MediaStyle を使用すると、折りたたまれたコンテンツ ビューも変更が可能で、3 つの操作ボタンも表示するように指定できます。そのためには、操作ボタンのインデックスを setShowActionsInCompactView() に指定します。

通知にアクティブなメディア セッションを表示する場合は、MediaSession.TokensetMediaSession() を使って通知に追加します。Android は、これをアクティブなメディア セッションを表示する通知と特定し、それに応じて対処します(たとえば、ロック画面にアルバムのアートワークを表示します)。

Kotlin

    import android.support.v4.app.NotificationCompat
    import android.support.v4.media.app.NotificationCompat as MediaNotificationCompat

    var notification = NotificationCompat.Builder(context, CHANNEL_ID)
            // Show controls on lock screen even when user hides sensitive content.
            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
            .setSmallIcon(R.drawable.ic_stat_player)
            // Add media control buttons that invoke intents in your media service
            .addAction(R.drawable.ic_prev, "Previous", prevPendingIntent) // #0
            .addAction(R.drawable.ic_pause, "Pause", pausePendingIntent) // #1
            .addAction(R.drawable.ic_next, "Next", nextPendingIntent) // #2
            // Apply the media style template
            .setStyle(MediaNotificationCompat.MediaStyle()
                    .setShowActionsInCompactView(1 /* #1: pause button \*/)
                    .setMediaSession(mediaSession.getSessionToken()))
            .setContentTitle("Wonderful music")
            .setContentText("My Awesome Band")
            .setLargeIcon(albumArtBitmap)
            .build()
    

Java

    Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
            // Show controls on lock screen even when user hides sensitive content.
            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
            .setSmallIcon(R.drawable.ic_stat_player)
            // Add media control buttons that invoke intents in your media service
            .addAction(R.drawable.ic_prev, "Previous", prevPendingIntent) // #0
            .addAction(R.drawable.ic_pause, "Pause", pausePendingIntent)  // #1
            .addAction(R.drawable.ic_next, "Next", nextPendingIntent)     // #2
            // Apply the media style template
            .setStyle(new android.support.v4.media.app.Notification.MediaStyle()
                    .setShowActionsInCompactView(1 /* #1: pause button */)
                    .setMediaSession(mediaSession.getSessionToken()))
            .setContentTitle("Wonderful music")
            .setContentText("My Awesome Band")
            .setLargeIcon(albumArtBitmap)
            .build();
    

図 4. 通知と使用するスタイル: NotificationCompat.MediaStyle

詳細については、フォアグラウンド サービスで MediaStyle 通知を使用する場合の説明もご確認ください。通知を使用するサンプルコードについては、Android のサンプル通知をご覧ください。