1page.title=通知 2page.tags=notifications 3helpoutsWidget=true 4page.image=/preview/images/notifications-card.png 5 6trainingnavtop=true 7 8@jd:body 9 10<div id="qv-wrapper"> 11<div id="qv"> 12 13<!-- table of contents --> 14<h2>このドキュメントの内容</h2> 15<ol> 16 <li><a href="#direct">ダイレクト リプライ</a></li> 17 <li><a href="#bundle">バンドル通知</a></li> 18 <li><a href="#custom">カスタムビュー</a></li> 19 <li><a href="#style">メッセージ スタイル</a></li> 20</ol> 21 22</div> 23</div> 24 25<p>Android N には、アプリが視認性の高いインタラクティブな通知を投稿できるようにする新しい API がいくつか導入されています。 26</p> 27 28<p>Android N では、ハンドセットでインライン リプライをサポートするために、既存の {@link android.support.v4.app.RemoteInput} 通知 API が拡張されています。 29これらの機能を使用すると、ユーザーは、アプリにアクセスすることなく、通知シェードからすばやく応答できます。 30</p> 31 32<p> 33 Android N では、類似した通知をバンドルして、単一の通知として表示することもできます。 34このバンドルを可能にするために、Android N では、既存の {@link 35 android.support.v4.app.NotificationCompat.Builder#setGroup 36 NotificationCompat.Builder.setGroup()} メソッドが使用されます。ユーザーは、各通知を展開して、通知シェードから個別に返信や消去などのアクションを各通知に対して行うことができます。 37 38 39</p> 40 41<p>最後に、Android N には、アプリのカスタマイズした通知ビューでシステム デコレーションを活用できるようにする新しい API が追加されています。 42これらの API は、通知ビューで、標準のテンプレートを使った一貫した表示を共有できるようにします。 43 44</p> 45 46<p>このドキュメントでは、アプリでこれらの新しい通知機能を使用するときに考慮する必要のある主な変更点について説明します。 47</p> 48 49<h2 id="direct">ダイレクト リプライ</h2> 50 51<p>Android N のダイレクト リプライ機能を使用すると、ユーザーは、テキスト メッセージにすばやく応答したり、通知インターフェース内でタスクリストを直接アップデートしたりできます。 52 53ハンドヘルド デバイスでは、インライン リプライ アクションが、通知にアタッチされた追加ボタンとして表示されます。 54ユーザーがキーボード経由で返信する場合、通知アクション向けに指定したインテントにテキストによる応答がアタッチされ、そのインテントがハンドヘルド デバイス用アプリに送信されます。 55 56 57 58 59 60<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x, 61 {@docRoot}preview/images/inline-reply_2x.png 2x" width="400"> 62<p class="img-caption"> 63 <strong>図 1.</strong> Android N に追加された [<strong>Reply</strong>] アクション ボタン。 64 65</p> 66 67<h3>インライン リプライ アクションを追加する</h3> 68 69<p>ダイレクト リプライをサポートする通知アクションを作成する方法は次のとおりです。 70</p> 71 72<ol> 73<li>通知アクションに追加できる {@link android.support.v4.app.RemoteInput.Builder} のインスタンスを作成します。 74 75このクラスのコンストラクタは、システムがテキスト入力のキーとして使用する文字列を受け取ります。 76その後、ハンドヘルド デバイス用アプリはそのキーを使用して、入力テキストを取得します。 77 78 79<pre> 80// Key for the string that's delivered in the action's intent. 81private static final String KEY_TEXT_REPLY = "key_text_reply"; 82String replyLabel = getResources().getString(R.string.reply_label); 83RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) 84 .setLabel(replyLabel) 85 .build(); 86</pre> 87</li> 88<li> <code>addRemoteInput()</code> を使用して、{@link android.support.v4.app.RemoteInput} オブジェクトをアクションにアタッチします。 89 90 91<pre> 92// Create the reply action and add the remote input. 93Notification.Action action = 94 new Notification.Action.Builder(R.drawable.ic_reply_icon, 95 getString(R.string.label), replyPendingIntent) 96 .addRemoteInput(remoteInput) 97 .build(); 98</pre> 99</li> 100 101<li>アクションを通知に適用し、通知を発行します。 102 103<pre> 104// Build the notification and add the action. 105Notification newMessageNotification = 106 new Notification.Builder(mContext) 107 .setSmallIcon(R.drawable.ic_message) 108 .setContentTitle(getString(R.string.title)) 109 .setContentText(getString(R.string.content)) 110 .addAction(action)) 111 .build(); 112 113// Issue the notification. 114NotificationManager notificationManager = 115 NotificationManager.from(mContext); 116notificationManager.notify(notificationId, newMessageNotification); 117 118</pre> 119</li> 120 121</ol> 122 123 124<p> ユーザーが通知アクションをトリガーすると、ユーザーは応答を入力するよう求められます。 125 </p> 126 127<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x, 128 {@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300"> 129<p class="img-caption"> 130 <strong>図 2.</strong> ユーザーは通知シェードでテキスト メッセージを入力できます。 131</p> 132 133<h3> 134 インライン リプライからユーザー入力を取得する 135</h3> 136 137<p> 138 リプライ アクションのインテントで宣言したアクティビティで、通知インターフェースからのユーザー入力を取得する方法は次のとおりです。 139 140</p> 141 142<ol> 143 <li>通知アクションのインテントを入力パラメータとして渡すことにより、{@link android.support.v4.app.RemoteInput#getResultsFromIntent 144 getResultsFromIntent()} を呼び出します。 145このメソッドは、テキストによる応答が含まれた {@link android.os.Bundle} を返します。 146 147 148 <pre> 149Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); 150</pre> 151 </li> 152 153 <li>result キー({@link 154 android.support.v4.app.RemoteInput.Builder} コンストラクタに提供されている)を使用して、バンドルへのクエリを実行します。次のコード スニペットに示すようにメソッドを作成することにより、このプロセスを完了して入力テキストを取得できます。 155 156 157 158 <pre> 159// Obtain the intent that started this activity by calling 160// Activity.getIntent() and pass it into this method to 161// get the associated string. 162 163private CharSequence getMessageText(Intent intent) { 164 Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); 165 if (remoteInput != null) { 166 return remoteInput.getCharSequence(KEY_TEXT_REPLY); 167 } 168 return null; 169 } 170</pre> 171 </li> 172 173 <li>以前の通知に指定したのと同じ通知 ID を使用して、別の通知をビルドして発行します。 174進捗インジケーターが通知インターフェースに表示されなくなり、リプライが正常に行われたことがわかります。 175 176この新しい通知で作業するときは、レシーバーの {@code onReceive()} メソッドに渡されるコンテキストを使用します。 177 178 179 <pre> 180// Build a new notification, which informs the user that the system 181// handled their interaction with the previous notification. 182Notification repliedNotification = 183 new Notification.Builder(context) 184 .setSmallIcon(R.drawable.ic_message) 185 .setContentText(getString(R.string.replied)) 186 .build(); 187 188// Issue the new notification. 189NotificationManager notificationManager = 190 NotificationManager.from(context); 191notificationManager.notify(notificationId, repliedNotification); 192</pre> 193 </li> 194</ol> 195 196<p> 197 チャットなどのインタラクティブなアプリでは、取得されたテキストを処理するときに、追加のコンテキストを含めると役立つ場合があります。 198たとえば、このようなアプリでは複数行のチャット履歴が表示されることがあります。 199{@link 200 android.support.v4.app.RemoteInput} を介してユーザーが応答した場合、{@code setRemoteInputHistory()} メソッドを使用してリプライ履歴を更新できます。 201 202</p> 203 204<p> 205 アプリがリモート入力を受け取った後、通知は更新またはキャンセルされる必要があります。 206ユーザーがダイレクト リプライを使用してリモート更新にリプライする場合は、通知をキャンセルしないでください。 207 208代わりに、通知を更新してユーザーのリプライを表示します。{@code MessagingStyle} を使用した通知の場合は、リプライを最新のメッセージとして追加する必要があります。 209 210他のテンプレートを使用する場合は、ユーザーのリプライをリモート入力履歴に追加できます。 211 212</p> 213 214<h2 id="bundle">バンドル通知</h2> 215 216<p>Android N は、通知のキューを表す新しい方法である 217 <i>バンドル通知</i>をデベロッパーに提供します。この機能は、Android Wear の<a href="{@docRoot}training/wearables/notifications/stacks.html">通知スタック</a>機能に似ています。 218 219たとえば、受信したメッセージの通知をアプリで作成する場合、複数のメッセージが受信されると、通知が単一のグループにバンドルされます。 220 221既存の {@link android.support.v4.app.NotificationCompat.Builder#setGroup 222Builder.setGroup()} メソッドを使用して、同様の通知をバンドルできます。 223</p> 224 225<p> 226 通知グループでは、通知グループを構成する通知が階層化されます。 227 この階層の最上位には、そのグループの概要情報を表示する親通知があります。 228ユーザーは通知グループを順次展開できます。ユーザーが階層を深くたどると、より多くの情報が表示されます。 229 230ユーザーがバンドルを展開すると、すべての子通知の詳細情報が表示されます。ユーザーがいずれかの通知を展開すると、そのコンテンツがすべて表示されます。 231 232 233</p> 234 235<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x, 236 {@docRoot}preview/images/bundles_2x.png 2x" width="300"> 237<p class="img-caption"> 238 <strong>図 3.</strong> ユーザーは通知グループを順次展開できます。 239 240</p> 241 242<p class="note"> 243 <strong>注:</strong>同じアプリが 4 つ以上の通知を送信するときにグループ化が指定されていない場合、システムにより自動的に通知がグループ化されます。 244 245 246</p> 247 248<p>通知をグループに追加する方法については、<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">各通知をグループに追加する</a>をご覧ください。 249 250</p> 251 252 253<h3 id="best-practices">バンドル通知のベストプラクティス</h3> 254<p>このセクションでは、前のバージョンの Android プラットフォームで利用可能な {@link android.app.Notification.InboxStyle InboxStyle} 通知の代わりに、通知グループを使用する必要がある状況についてのガイドラインを提供します。 255 256 257</p> 258 259<h3>バンドル通知を使用するとき</h3> 260 261<p>ユースケースで次のすべての条件が満たされた場合にのみ通知グループを使用する必要があります。 262</p> 263 264<ul> 265 <li>子通知が完全な通知であり、グループの概要なしに、子通知を個別に表示できる。 266</li> 267 <li>子通知を個別に表示するメリットがある。次に例を示します。 268 269 </li> 270 <ul> 271 <li>子通知がアクション可能であり、各子通知に固有のアクションがある。</li> 272 <li>ユーザーが読みたい多くの情報が子通知にある。</li> 273 </ul> 274</ul> 275 276<p>通知グループの適切なユースケースの例には、着信メッセージのリストを表示するメッセージング アプリや受信したメールのリストを表示するメールアプリなどが含まれます。 277 278</p> 279 280<p> 281単一の通知が望ましいユースケースの例には、1 人のユーザーからの個別メッセージや、1 行のテキスト メッセージ アイテムのリスト表示が含まれます。 282 283このリスト表示を行うには、 284{@link android.app.Notification.InboxStyle InboxStyle} または {@link android.app.Notification.BigTextStyle BigTextStyle} を使用します。 285 286 287</p> 288 289<h3 id ="post">バンドル通知を表示する</h3> 290 291<p> 292 アプリは、グループに単一の子通知が含まれている場合でも、グループの概要を常に送信する必要があります。 293グループに単一の通知のみが含まれている場合、システムによって、概要の表示が非表示になり、子通知が直接表示されます。 294これにより、ユーザーがグループの子通知をスワイプして消すときに一貫した使用感が出ます。 295 296 297</p> 298 299<p class="note"> 300 <strong>注:</strong>このバージョンの Android N では、単一の子通知が含まれる通知グループの概要を非表示にできません。 301この機能は、将来のバージョンの Android N に追加されます。 302 303</p> 304 305<h3>通知をピークする</h3> 306 307<p>通常、子通知はグループとして表示されますが、子通知を<a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">ヘッドアップ通知</a>として一時的に表示するように設定できます。 308 309 310この機能は、特に最新の子通知とその関連するアクションへの即時アクセスを可能にするので便利です。 311 312</p> 313 314 315<h3>下位互換性</h3> 316 317<p> 318 Android 5.0(API レベル 21)以降では、Android Wear 端末をサポートするために、通知グループとリモート入力が {@link 319 android.app.Notification} API の一部になっています。 320これらの API を使用して通知を既に作成している場合は、アプリの動作が上記のガイドラインに適合していることの確認と、{@code 321 setRemoteInputHistory()} の実装検討のみを行ってください。 322 323 324</p> 325 326<p> 327 下位互換性をサポートするために、サポート ライブラリの {@link android.support.v4.app.NotificationCompat} クラスで同じ API が利用できるようになっているため、前の Android バージョンで機能する通知を作成できます。 328 329 330携帯端末とタブレットでは、概要通知のみがユーザーに表示されるため、アプリは、受信トレイスタイルやグループの全情報を表す同等の通知を引き続きサポートする必要があります。 331 332Android Wear 端末では、古いプラットフォーム レベル上にもすべての子通知が表示されるため、API レベルに関係なく、子通知を作成する必要があります。 333 334 335 336</p> 337 338<h2 id="custom"> カスタムビュー</h2> 339<p>Android N 以降では通知ビューをカスタマイズでき、通知ヘッダー、アクション、展開レイアウトなどのシステム デコレーションを引き続き取得できます。 340 341</p> 342 343<p>この機能を有効にするために、Android N には、カスタムビューにスタイルを適用する次の API が追加されています。 344</p> 345 346<dl> 347<dt> 348{@code DecoratedCustomViewStyle()}</dt> 349<dd> メディア通知以外の通知にスタイルを適用します。 350</dd> 351<dt> 352{@code DecoratedMediaCustomViewStyle()}</dt> 353<dd> メディア通知にスタイルを適用します。</dd> 354</dl> 355 356<p>この新しい API を使用するには、{@code setStyle()} メソッドを呼び出し、目的のカスタムビュー スタイルに渡します。 357</p> 358 359<p>次のコード スニペットは、 360{@code DecoratedCustomViewStyle()} メソッドでカスタム通知オブジェクトを作成する方法を示しています。</p> 361 362<pre> 363Notification notification = new Notification.Builder() 364 .setSmallIcon(R.drawable.ic_stat_player) 365 .setLargeIcon(albumArtBitmap)) 366 .setCustomContentView(contentView); 367 .setStyle(new Notification.DecoratedCustomViewStyle()) 368 .build(); 369 370</pre> 371 372<h2 id="style">メッセージング スタイル</h2> 373<p> 374 Android N では、通知スタイルをカスタマイズするための新しい API が提供されます。 375 <code>MessageStyle</code> クラスを使用して、会話タイトル、追加メッセージ、通知のコンテンツ ビューなど、通知に表示される複数のラベルを変更できます。 376 377 378</p> 379 380<p> 381 次のコード スニペットは、<code>MessageStyle</code> クラスを使用して通知のスタイルをカスタマイズする方法を示しています。 382 383</p> 384 385<pre> 386 Notification notification = new Notification.Builder() 387 .setStyle(new Notification.MessagingStyle("Me") 388 .setConversationTitle("Team lunch") 389 .addMessage("Hi", timestamp1, null) // Pass in null for user. 390 .addMessage("What's up?", timestamp2, "Coworker") 391 .addMessage("Not much", timestamp3, null) 392 .addMessage("How about lunch?", timestamp4, "Coworker")); 393</pre> 394