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