• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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