• 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</ol>
20
21</div>
22</div>
23
24<p>В Android N представлено несколько новых API-интерфейсов, позволяющих
25публиковать заметные и интерактивные уведомления.</p>
26
27<p>Существующий API-интерфейс уведомлений {@link android.support.v4.app.RemoteInput}
28в Android N расширен для поддержки внутренних ответов на смартфонах. С помощью этой возможности
29 пользователи могут быстро отвечать на сообщения в панели уведомлений, не открывая приложение.</p>
30
31<p>
32  Android N также позволяет группировать несколько похожих
33  уведомлений, чтобы они отображались как одно. Для этого в Android N используется существующий метод {@link
34  android.support.v4.app.NotificationCompat.Builder#setGroup
35  NotificationCompat.Builder.setGroup()}. Пользователи могут развернуть все
36  уведомления и выполнить различные действия, например ответить на сообщение
37  или закрыть каждое из уведомлений по отдельности в панели уведомлений.
38</p>
39
40<p>Наконец, в Android N представлены новые API-интерфейсы, позволяющие
41использовать системные элементы в собственных представлениях уведомлений вашего приложения. Благодаря им
42уведомления отображаются единообразно на основе
43стандартных шаблонов.</p>
44
45<p>В этом документе рассматриваются некоторые наиболее важные изменения,
46 которые следует учитывать при использовании новых уведомлений в приложениях.</p>
47
48<h2 id="direct">Прямой ответ</h2>
49
50<p>С помощью прямых ответов пользователи
51 Android N могут быстро отвечать на текстовые сообщения и обновлять списки задач непосредственно в интерфейсе
52уведомлений. На мобильных устройствах действие внутреннего ответа обозначается
53 как дополнительная кнопка в уведомлении. Если пользователь набирает ответ на клавиатуре, система
54 прикрепляет текст ответа к намерению,
55 указанному для действия уведомления, и передает намерение в ваше
56 приложение.
57
58
59<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x,
60  {@docRoot}preview/images/inline-reply_2x.png 2x" width="400">
61<p class="img-caption">
62  <strong>Рисунок 1.</strong> В Android N добавлена кнопка <strong>Reply</strong>.
63
64</p>
65
66<h3>Добавление действий внутренних ответов</h3>
67
68<p>Создание действия уведомления, которое поддерживает прямой ответ:
69</p>
70
71<ol>
72<li>Создайте экземпляр класса {@link android.support.v4.app.RemoteInput.Builder},
73 который можно добавить в действие
74уведомления. Конструктор класса принимает строку, которую система использует как
75 ключ для введенного текста. Потом ваше приложение использует этот ключ для получения
76 текста.
77
78<pre>
79// Key for the string that's delivered in the action's intent
80private static final String KEY_TEXT_REPLY = "key_text_reply";
81String replyLabel = getResources().getString(R.string.reply_label);
82RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
83        .setLabel(replyLabel)
84        .build();
85</pre>
86</li>
87<li>Прикрепите объект {@link android.support.v4.app.RemoteInput}
88 к действию с помощью метода <code>addRemoteInput()</code>.
89
90<pre>
91// Create the reply action and add the remote input
92Notification.Action action =
93        new Notification.Action.Builder(R.drawable.ic_reply_icon,
94                getString(R.string.label), replyPendingIntent)
95                .addRemoteInput(remoteInput)
96                .build();
97</pre>
98</li>
99
100<li>Примените действие к уведомлению и отправьте его.
101
102<pre>
103// Build the notification and add the action
104Notification notification =
105        new Notification.Builder(mContext)
106                .setSmallIcon(R.drawable.ic_message)
107                .setContentTitle(getString(R.string.title))
108                .setContentText(getString(R.string.content))
109                .addAction(action))
110                .build();
111
112// Issue the notification
113NotificationManager notificationManager =
114        NotificationManager.from(mContext);
115notificationManager.notify(notificationId, notification);
116
117</pre>
118</li>
119
120</ol>
121
122
123<p> Система запрашивает у пользователя ввод ответа, если он инициирует
124действие уведомления. </p>
125
126<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x,
127    {@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300">
128<p class="img-caption">
129  <strong>Рисунок 2.</strong> Пользователь вводит текст в панели уведомлений.
130</p>
131
132<h3>Получение введенного пользователем текста из внутреннего ответа</h3>
133
134<p>Получение введенного пользователем текста из интерфейса
135уведомлений в операции, объявленной в намерении действия:</p>
136<ol>
137<li> Вызовите метод {@link android.support.v4.app.RemoteInput#getResultsFromIntent
138  getResultsFromIntent()}, передав намерение действия уведомления
139 в качестве входного параметра. Этот метод возвращает объект {@link android.os.Bundle},
140 содержащий текст ответа.
141</li>
142
143<pre>
144Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
145</pre>
146
147<li>Запросите группу, используя ключ результата (предоставленный конструктору {@link
148  android.support.v4.app.RemoteInput.Builder}).
149</li>
150</ol>
151
152<p>В следующем фрагменте кода показано, как метод извлекает введенный
153текст из группы:</p>
154
155<pre>
156// Obtain the intent that started this activity by calling
157// Activity.getIntent() and pass it into this method to
158// get the associated string.
159
160private CharSequence getMessageText(Intent intent) {
161    Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
162    if (remoteInput != null) {
163            return remoteInput.getCharSequence(KEY_TEXT_REPLY);
164            }
165    return null;
166 }
167</pre>
168
169<p>Приложения могут применять логику, чтобы определить, какие действия следует выполнить с полученным
170текстом.
171Для интерактивных приложений (например, чатов) предоставьте больше контекста в самом уведомлении
172 (например, несколько строк истории чата, в том числе собственные сообщения пользователя),
173 чтобы у пользователя было достаточно информации для ответа.
174Когда пользователь отвечает через {@link android.support.v4.app.RemoteInput},
175 добавьте текст в историю ответов, применив метод {@code setRemoteInputHistory()}.
176</p>
177
178<h2 id="bundle">Группы уведомлений</h2>
179
180<p>Android N предоставляет разработчикам новый способ отображения
181 очереди уведомлений: <i>группы уведомлений</i>. Они похожи на
182  <a href="{@docRoot}training/wearables/notifications/stacks.html">стеки
183 уведомлений</a> в Android Wear. Например, если приложение создает уведомления
184 для входящих сообщений и получено несколько сообщений, объедините
185 уведомления в одну группу. Для группировки похожих уведомлений используйте
186 существующий метод {@link android.support.v4.app.NotificationCompat.Builder#setGroup
187Builder.setGroup()}.</p>
188
189<p>
190  Уведомления в группе формируют иерархию,
191  на вершине которой находится родительское уведомление, отображающее
192 сводную информацию о группе. Пользователь может постепенно
193 раскрывать группу уведомлений, при этом система показывает дополнительные
194  сведения. Если пользователь раскрывает группу, система отображает больше
195 информации о всех дочерних уведомлениях. Если же пользователь
196 развернет одно из уведомлений, его содержимое показывается полностью.
197</p>
198
199<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x,
200          {@docRoot}preview/images/bundles_2x.png 2x" width="300">
201<p class="img-caption">
202  <strong>Рисунок 3.</strong> Пользователь может постепенно раскрывать группу уведомлений.
203
204</p>
205
206<p>Добавление уведомлений в группу описано в разделе
207<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">Добавление
208каждого уведомления в группу</a>.</p>
209
210
211<h3 id="best-practices">Рекомендации по работе с группами уведомлений</h3>
212<p>В этом разделе описываются рекомендации по использованию групп
213уведомлений вместо уведомлений {@link android.app.Notification.InboxStyle InboxStyle},
214 которые были доступны в предыдущих версиях платформы
215 Android.</p>
216
217<h3>Ситуации, в которых следует использовать группы уведомлений</h3>
218
219<p>Вам следует использовать группы уведомлений, только если выполняются
220все следующие условия.</p>
221
222<ul>
223  <li>Дочерние уведомления являются полноценными уведомлениями, которые можно
224 показать отдельно без сводной информации о группе.</li>
225  <li>Отображение дочерних уведомлений по отдельности имеет смысл. Например:
226
227  </li>
228  <ul>
229    <li>в дочерних уведомлениях можно выполнять какие-либо соответствующие им действия;</li>
230    <li>дочернему уведомлению предшествует больше информации, чем требуется пользователю.</li>
231  </ul>
232</ul>
233
234<p>Примером использования групп уведомлений может служить приложение
235для обмена сообщениями, которое показывает список входящих сообщений,
236или почтовое приложение, отображающее список полученных писем.</p>
237
238<p>
239К примерам ситуаций, когда предпочтительнее использовать одно
240 уведомление, относятся отдельные сообщения от одного пользователя или
241 списочное представление однострочных текстовых элементов. Для них можно использовать
242{@link android.app.Notification.InboxStyle InboxStyle} или
243{@link android.app.Notification.BigTextStyle BigTextStyle}.
244
245</p>
246
247<h3 id ="post">Отображение группы уведомлений</h3>
248
249<p>
250  Приложение всегда должно публиковать сводную информацию группы, даже если эта группа содержит
251 всего одно дочернее уведомление. В этом случае система не показывает сводную информацию, а
252 непосредственно отображает это уведомление. Это обеспечивает
253 единообразие интерфейса при
254 пролистывании дочернего элемента группы.
255</p>
256
257<p class="note">
258  <strong>Примечание.</strong> Эта версия Android N пока еще не
259 блокирует отображение сводной информации для групп уведомлений, содержащих только один дочерний элемент. Эта
260 возможность будет добавлена в следующих версиях Android N.
261</p>
262
263<h3>Всплывающие уведомления</h3>
264
265<p>Хотя система обычно отображает дочерние уведомления в виде группы,
266 их можно временно показывать в виде
267 <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">всплывающих
268уведомлений</a>. Эта возможность очень удобна, так как позволяет
269 быстро получить доступ к последнему дочернему уведомлению и связанным с ним действиям.
270</p>
271
272
273<h3>Обратная совместимость</h3>
274
275<p>
276  И группы уведомлений, и удаленный ввод входили в состав API {@link
277  android.app.Notification} для поддержки устройств
278 Android Wear, начиная с Android 5.0 (уровень API 21). Если вы уже использовали эти API-интерфейсы для создания уведомлений,
279 вам нужно только убедиться, что поведение приложения соответствует
280 описанным выше рекомендациям, и рассмотреть возможность реализации {@code
281  setRemoteInputHistory()}.
282</p>
283
284<p>
285  Для поддержки обратной совместимости те же API-интерфейсы доступны в
286 классе {@link android.support.v4.app.NotificationCompat}
287 вспомогательной библиотеки, что позволяет реализовать уведомления, работающие в предыдущих версиях Android.
288 На смартфонах и планшетах пользователи видят только сводное уведомление,
289 поэтому в приложении все равно должно быть уведомление
290 в стиле Inbox или аналогичное уведомление, содержащее всю информацию о группе. Так как устройства Android
291Wear позволяют пользователям видеть все дочерние уведомления даже
292 на более ранних уровнях платформы, эти уведомления следует создавать независимо от уровня API.
293
294</p>
295
296<h2 id="custom"> Собственные представления</h2>
297<p>Начиная с Android N, вы можете настраивать представления уведомлений
298и по-прежнему получать системные элементы, такие как заголовки уведомлений, действия и
299расширяемые макеты.</p>
300
301<p>Для этого в Android N добавлены следующие API-интерфейсы, позволяющие
302 настраивать собственные представления.</p>
303
304<dl>
305<dt>
306{@code DecoratedCustomViewStyle()}</dt>
307<dd> Определяет стиль для всех уведомлений, кроме
308уведомлений мультимедиа.</dd>
309<dt>
310{@code DecoratedMediaCustomViewStyle()}</dt>
311<dd> Определяет стиль для уведомлений мультимедиа.</dd>
312</dl>
313
314<p>Чтобы воспользоваться этим новым API-интерфейсом, вызовите метод {@code setStyle()}, передав в него
315нужный стиль собственного представления.</p>
316
317<p>В этом фрагменте показано, как создать собственный объект уведомления с помощью метода
318{@code DecoratedCustomViewStyle()}.</p>
319
320<pre>
321Notification noti = new Notification.Builder()
322           .setSmallIcon(R.drawable.ic_stat_player)
323           .setLargeIcon(albumArtBitmap))
324           .setCustomContentView(contentView);
325           .setStyle(new Notification.DecoratedCustomViewStyle())
326           .build();
327
328</pre>
329