1page.title=알림 2page.tags=알림 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에서는 가시성과 상호 작용이 뛰어난 알림을 26앱이 게시할 수 있도록 여러 가지 새로운 API를 도입했습니다.</p> 27 28<p>Android N에서는 핸드셋에서 인라인 회신을 지원하기 위해 기존의 {@link android.support.v4.app.RemoteInput} 29알림 API를 확장합니다. 이 기능을 사용하면 앱을 방문하지 않고도 알림 창에서 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에서는 또한 앱의 사용자 지정된 알림 42뷰에서 시스템 장식을 활용할 수 있는 새 API를 추가합니다. 이들 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>({@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알림 표시기가 사라집니다. 이 새로운 알림으로 작업할 때, 수신기의 177{@code onReceive()} 메서드로 전달되는 컨텍스트를 사용하세요. 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}을 통해 응답하는 경우, 201{@code setRemoteInputHistory()} 메서드를 사용하여 회신 기록을 업데이트할 수 있습니다. 202</p> 203 204<p> 205 앱이 원격 입력을 수신한 후에는 알림이 업데이트되거나 206 취소되어야 합니다. 사용자가 Direct Reply를 사용하여 원격 업데이트에 207회신할 때는 알림을 208취소하지 마세요. 그 대신, 사용자의 회신을 표시하도록 알림을 업데이트하세요. 209{@code MessagingStyle}을 사용하는 알림의 경우, 회신을 최신 메시지로서 210추가해야 합니다. 다른 템플릿을 사용할 경우 사용자의 211회신을 원격 입력 기록에 추가할 수 있습니다. 212</p> 213 214<h2 id="bundle">묶음 알림</h2> 215 216<p>Android N에서는 일련의 알림을 표시하기 위한 새로운 방식을 217개발자에게 제공합니다. <i>묶음 알림</i>. 이것은 218Android Wear의 <a href="{@docRoot}training/wearables/notifications/stacks.html">알림 219스택</a> 기능과 유사합니다. 예를 들어, 수신된 메시지에 대해 앱이 알림을 생성하는 경우, 220둘 이상의 메시지가 수신되면 그 알림을 하나의 221단일 그룹으로 묶습니다. 기존의 222{@link android.support.v4.app.NotificationCompat.Builder#setGroup 223Builder.setGroup()} 메서드를 사용하여 유사한 알림을 묶을 수 있습니다.</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>알림을 그룹에 추가하는 방법을 알아보려면 249<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">각 250알림을 그룹에 추가</a>를 참조하세요.</p> 251 252 253<h3 id="best-practices">묶음 알림의 모범 사례</h3> 254<p>이 섹션에서는 이전 버전의 Android 플랫폼에서 255사용되었던 {@link android.app.Notification.InboxStyle InboxStyle} 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단일 알림이 바람직한 사례의 예로는, 한 사람이 보낸 282개별 메시지나 1줄 텍스트 항목의 목록 표시가 283있습니다. 이를 수행하기 위해 284({@link android.app.Notification.InboxStyle InboxStyle} 또는 285{@link android.app.Notification.BigTextStyle BigTextStyle})을 사용할 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항목이 포함된 알림 그룹에 대해 요약을 억제하지 않습니다. 이 302기능은 이후 버전의 Android N에 추가될 것입니다. 303</p> 304 305<h3>피킹 알림</h3> 306 307<p>시스템은 308일반적으로 하위 알림을 그룹으로 표시하지만, 309이 알림이 일시적으로 <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">헤드업 알림</a>으로 310나타나도록 설정할 수 있습니다. 이 기능을 사용하면 가장 최근의 하위 항목과 이에 311관련된 동작에 즉시 액세스할 수 있으므로 특히 유용합니다. 312</p> 313 314 315<h3>이전 버전과의 호환성</h3> 316 317<p> 318 Android 5.0(API 레벨 21) 이후로, 알림 그룹과 319원격 입력은 Android Wear 기기를 지원하기 위한 {@link 320 android.app.Notification} API의 일부였습니다. 이미 이들 API로 알림을 작성한 경우 수행할 조치는, 321앱 동작이 위에 설명된 지침과 일치하는지 확인하고 {@code 322 setRemoteInputHistory()} 구현을 323고려하는 것입니다. 324</p> 325 326<p> 327 이전 버전과의 호환성을 지원하기 위해, 328지원 라이브러리의 {@link android.support.v4.app.NotificationCompat} 329클래스로 동일한 API를 사용할 수 있으며, 이전 Android 버전에서 작동하는 알림을 작성할 330수 있습니다. 핸드헬드와 태블릿에서는 요약 알림만 사용자에게 보이므로, 331앱은 해당 그룹의 전체 정보 콘텐츠에 대해 받은편지함 332스타일이나 이와 동등한 알림 표시를 계속 가져야 합니다. Android 333Wear 기기에서는 구형 플랫폼 레벨에서도 334사용자가 모든 하위 알림을 볼 수 있으므로, API 레벨에 상관없이 하위 알림을 335작성해야 합니다. 336</p> 337 338<h2 id="custom"> 사용자 지정 뷰</h2> 339<p>Android N부터는 알림 뷰를 사용자 지정할 수 있으며 340알림 헤더, 동작 및 확장 가능한 레이아웃과 같은 시스템 장식을 계속 341획득할 수 있습니다.</p> 342 343<p>이 기능을 활성화하기 위해, Android N에서는 다음과 344같은 API를 추가하여 사용자 지정 뷰의 스타일을 지정합니다.</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 다음 코드 조각에서는 382 <code>MessageStyle</code> 클래스를 사용하여 알림 스타일을 사용자 지정하는 방법을 보여 줍니다. 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