page.title=알림 page.tags=알림 helpoutsWidget=true page.image=/preview/images/notifications-card.png trainingnavtop=true @jd:body <div id="qv-wrapper"> <div id="qv"> <!-- table of contents --> <h2>이 문서의 내용</h2> <ol> <li><a href="#direct">직접 회신</a></li> <li><a href="#bundle">묶음 알림</a></li> <li><a href="#custom">사용자 지정 뷰</a></li> <li><a href="#style">메시지 스타일</a></li> </ol> </div> </div> <p>Android N에서는 가시성과 상호 작용이 뛰어난 알림을 앱이 게시할 수 있도록 여러 가지 새로운 API를 도입했습니다.</p> <p>Android N에서는 핸드셋에서 인라인 회신을 지원하기 위해 기존의 {@link android.support.v4.app.RemoteInput} 알림 API를 확장합니다. 이 기능을 사용하면 앱을 방문하지 않고도 알림 창에서 신속하게 응답할 수 있습니다.</p> <p> Android N에서는 또한 비슷한 알림을 묶어서 단일 알림으로 표시할 수도 있습니다. 이것이 가능하도록, Android N에서는 기존의 {@link android.support.v4.app.NotificationCompat.Builder#setGroup NotificationCompat.Builder.setGroup()} 메서드를 사용합니다. 사용자가 각 알림을 확장할 수 있으며, 각 알림에 대해 회신 및 닫기와 같은 동작을 알림 창에서 개별적으로 수행할 수 있습니다. </p> <p>마지막으로, Android N에서는 또한 앱의 사용자 지정된 알림 뷰에서 시스템 장식을 활용할 수 있는 새 API를 추가합니다. 이들 API는 표준 템플릿을 통해 알림 뷰가 일관된 프레젠테이션을 공유하도록 보장해 줍니다.</p> <p>이 문서에서는 새 알림 기능을 앱에서 사용할 때 고려해야 하는 몇 가지 주요 변경 사항을 중점적으로 다룹니다.</p> <h2 id="direct">직접 회신</h2> <p>Android N에 있는 직접 회신 기능을 사용하여, 사용자가 문자 메시지에 신속하게 응답하거나 알림 인터페이스 내에서 직접 작업 목록을 업데이트할 수 있습니다. 핸드헬드에서 인라인 회신 동작은 알림에 연결된 추가적인 버튼으로 나타납니다. 사용자가 키보드를 통해 회신하면 시스템은 여러분이 알림 동작에 지정했던 인텐트에 텍스트 응답을 첨부하고 이 인텐트를 핸드헬드 앱으로 보냅니다. <img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x, {@docRoot}preview/images/inline-reply_2x.png 2x" width="400"> <p class="img-caption"> <strong>그림 1.</strong> Android N이 <strong>Reply</strong> 동작 버튼을 추가합니다. </p> <h3>인라인 회신 동작 추가</h3> <p>직접 회신을 지원하는 알림 동작을 만들려면: </p> <ol> <li>알림 동작에 추가할 수 있는 {@link android.support.v4.app.RemoteInput.Builder}의 인스턴스를 만듭니다. 이 클래스의 생성자는 시스템이 텍스트 입력의 키로 사용하는 문자열을 수락합니다. 나중에 핸드헬드 앱은 이 키를 사용하여 입력 텍스트를 검색합니다. <pre> // Key for the string that's delivered in the action's intent. private static final String KEY_TEXT_REPLY = "key_text_reply"; String replyLabel = getResources().getString(R.string.reply_label); RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) .setLabel(replyLabel) .build(); </pre> </li> <li><code>addRemoteInput()</code>을 사용하여 {@link android.support.v4.app.RemoteInput} 객체를 동작에 첨부합니다. <pre> // Create the reply action and add the remote input. Notification.Action action = new Notification.Action.Builder(R.drawable.ic_reply_icon, getString(R.string.label), replyPendingIntent) .addRemoteInput(remoteInput) .build(); </pre> </li> <li>동작을 알림에 적용하고 알림을 발생합니다. <pre> // Build the notification and add the action. Notification newMessageNotification = new Notification.Builder(mContext) .setSmallIcon(R.drawable.ic_message) .setContentTitle(getString(R.string.title)) .setContentText(getString(R.string.content)) .addAction(action)) .build(); // Issue the notification. NotificationManager notificationManager = NotificationManager.from(mContext); notificationManager.notify(notificationId, newMessageNotification); </pre> </li> </ol> <p> 시스템이 사용자에게 알림 동작이 트리거될 때 응답을 입력하라는 메시지를 표시합니다. </p> <img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x, {@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300"> <p class="img-caption"> <strong>그림 2.</strong> 사용자가 알림 창에서 텍스트를 입력합니다. </p> <h3> 인라인 회신에서 사용자 입력을 검색 </h3> <p> 회신 동작의 인텐트에 선언하셨던 액티비티에 대해 알림 인터페이스로부터 사용자 입력을 수신하려면: </p> <ol> <li>알림 동작의 인텐트를 입력 매개변수로서 전달하여 {@link android.support.v4.app.RemoteInput#getResultsFromIntent getResultsFromIntent()}를 호출합니다. 이 메서드는 텍스트 응답이 포함된 {@link android.os.Bundle}을 반환합니다. <pre> Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); </pre> </li> <li>({@link android.support.v4.app.RemoteInput.Builder} 생성자에 제공된) 결과 키를 사용하여 번들에 쿼리를 수행합니다. 다음 코드 조각에서처럼, 메서드를 만들어 이 프로세스를 완료하고 입력 텍스트를 검색할 수 있습니다. <pre> // Obtain the intent that started this activity by calling // Activity.getIntent() and pass it into this method to // get the associated string. private CharSequence getMessageText(Intent intent) { Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); if (remoteInput != null) { return remoteInput.getCharSequence(KEY_TEXT_REPLY); } return null; } </pre> </li> <li>이전 알림에 대해 제공했던 것과 동일한 알림 ID를 사용하여, 다른 알림을 작성하고 발급합니다. 사용자에게 성공적으로 회신했음을 알려주기 위해 알림 인터페이스에서 알림 표시기가 사라집니다. 이 새로운 알림으로 작업할 때, 수신기의 {@code onReceive()} 메서드로 전달되는 컨텍스트를 사용하세요. <pre> // Build a new notification, which informs the user that the system // handled their interaction with the previous notification. Notification repliedNotification = new Notification.Builder(context) .setSmallIcon(R.drawable.ic_message) .setContentText(getString(R.string.replied)) .build(); // Issue the new notification. NotificationManager notificationManager = NotificationManager.from(context); notificationManager.notify(notificationId, repliedNotification); </pre> </li> </ol> <p> 채팅과 같은 대화형 앱의 경우, 검색된 텍스트를 처리할 때 추가 컨텍스트를 포함하는 것이 유용할 수 있습니다. 예를 들어, 이들 앱은 여러 줄의 채팅 기록을 표시할 수 있습니다. 사용자가 {@link android.support.v4.app.RemoteInput}을 통해 응답하는 경우, {@code setRemoteInputHistory()} 메서드를 사용하여 회신 기록을 업데이트할 수 있습니다. </p> <p> 앱이 원격 입력을 수신한 후에는 알림이 업데이트되거나 취소되어야 합니다. 사용자가 Direct Reply를 사용하여 원격 업데이트에 회신할 때는 알림을 취소하지 마세요. 그 대신, 사용자의 회신을 표시하도록 알림을 업데이트하세요. {@code MessagingStyle}을 사용하는 알림의 경우, 회신을 최신 메시지로서 추가해야 합니다. 다른 템플릿을 사용할 경우 사용자의 회신을 원격 입력 기록에 추가할 수 있습니다. </p> <h2 id="bundle">묶음 알림</h2> <p>Android N에서는 일련의 알림을 표시하기 위한 새로운 방식을 개발자에게 제공합니다. <i>묶음 알림</i>. 이것은 Android Wear의 <a href="{@docRoot}training/wearables/notifications/stacks.html">알림 스택</a> 기능과 유사합니다. 예를 들어, 수신된 메시지에 대해 앱이 알림을 생성하는 경우, 둘 이상의 메시지가 수신되면 그 알림을 하나의 단일 그룹으로 묶습니다. 기존의 {@link android.support.v4.app.NotificationCompat.Builder#setGroup Builder.setGroup()} 메서드를 사용하여 유사한 알림을 묶을 수 있습니다.</p> <p> 알림 그룹은 이 그룹을 구성하는 알림을 계층 구조로 만듭니다. 계층 구조의 맨 위는 그룹의 요약 정보가 표시되는 상위 알림입니다. 사용자는 알림 그룹을 점진적으로 확장할 수 있으며, 시스템은 사용자가 더 깊이 파고들수록 더 많은 정보를 표시합니다. 사용자가 번들을 확장하면 시스템은 모든 하위 알림에 대해 더 많은 정보를 표시하며, 사용자가 이들 알림 중 하나를 확장하면 시스템은 알림의 전체 콘텐츠를 표시합니다. </p> <img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x, {@docRoot}preview/images/bundles_2x.png 2x" width="300"> <p class="img-caption"> <strong>그림 3.</strong> 사용자는 알림 그룹을 점진적으로 확장할 수 있습니다. </p> <p class="note"> <strong>참고:</strong> 동일 앱이 4개 이상의 알림을 보내면서 그룹화를 지정하지 않으면, 시스템에서 이들 알림을 자동으로 그룹화합니다. </p> <p>알림을 그룹에 추가하는 방법을 알아보려면 <a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">각 알림을 그룹에 추가</a>를 참조하세요.</p> <h3 id="best-practices">묶음 알림의 모범 사례</h3> <p>이 섹션에서는 이전 버전의 Android 플랫폼에서 사용되었던 {@link android.app.Notification.InboxStyle InboxStyle} 알림 대신에 알림 그룹을 사용할 때의 지침을 제공합니다.</p> <h3>묶음 알림을 사용하는 경우</h3> <p>자신의 사용 사례에서 다음의 모든 조건이 충족되는 경우에만 알림 그룹을 사용해야 합니다.</p> <ul> <li>하위 알림은 완전한 알림이며 그룹 요약이 필요 없이 개별적으로 표시될 수 있습니다.</li> <li>하위 알림을 개별적으로 표시하는 경우 이점이 있습니다. 예를 들면 다음과 같습니다. </li> <ul> <li>알림이 실행 가능하며, 각 하위 알림에 맞는 동작이 있습니다.</li> <li>사용자가 읽고 싶어하는 하위 알림에 더 많은 정보가 있습니다.</li> </ul> </ul> <p>알림 그룹의 사용 사례에 대한 좋은 예로는, 수신 메시지의 목록을 표시하는 메시징 앱이나 수신된 이메일의 목록을 표시하는 이메일 앱이 있습니다.</p> <p> 단일 알림이 바람직한 사례의 예로는, 한 사람이 보낸 개별 메시지나 1줄 텍스트 항목의 목록 표시가 있습니다. 이를 수행하기 위해 ({@link android.app.Notification.InboxStyle InboxStyle} 또는 {@link android.app.Notification.BigTextStyle BigTextStyle})을 사용할 수 있습니다. </p> <h3 id ="post">묶음 알림 표시</h3> <p> 그룹에 하나의 하위 항목만 포함되어 있더라도 앱은 항상 그룹 요약을 게시해야 합니다. 하나의 알림만 포함된 경우에는 시스템이 요약을 억제하고 하위 알림을 직접 표시합니다. 이렇게 하면 사용자가 그룹의 하위 항목을 스와이프할 때 시스템이 일관된 경험을 제공할 수 있습니다. </p> <p class="note"> <strong>참고:</strong> 이 버전의 Android N에서는 아직 단일 하위 항목이 포함된 알림 그룹에 대해 요약을 억제하지 않습니다. 이 기능은 이후 버전의 Android N에 추가될 것입니다. </p> <h3>피킹 알림</h3> <p>시스템은 일반적으로 하위 알림을 그룹으로 표시하지만, 이 알림이 일시적으로 <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">헤드업 알림</a>으로 나타나도록 설정할 수 있습니다. 이 기능을 사용하면 가장 최근의 하위 항목과 이에 관련된 동작에 즉시 액세스할 수 있으므로 특히 유용합니다. </p> <h3>이전 버전과의 호환성</h3> <p> Android 5.0(API 레벨 21) 이후로, 알림 그룹과 원격 입력은 Android Wear 기기를 지원하기 위한 {@link android.app.Notification} API의 일부였습니다. 이미 이들 API로 알림을 작성한 경우 수행할 조치는, 앱 동작이 위에 설명된 지침과 일치하는지 확인하고 {@code setRemoteInputHistory()} 구현을 고려하는 것입니다. </p> <p> 이전 버전과의 호환성을 지원하기 위해, 지원 라이브러리의 {@link android.support.v4.app.NotificationCompat} 클래스로 동일한 API를 사용할 수 있으며, 이전 Android 버전에서 작동하는 알림을 작성할 수 있습니다. 핸드헬드와 태블릿에서는 요약 알림만 사용자에게 보이므로, 앱은 해당 그룹의 전체 정보 콘텐츠에 대해 받은편지함 스타일이나 이와 동등한 알림 표시를 계속 가져야 합니다. Android Wear 기기에서는 구형 플랫폼 레벨에서도 사용자가 모든 하위 알림을 볼 수 있으므로, API 레벨에 상관없이 하위 알림을 작성해야 합니다. </p> <h2 id="custom"> 사용자 지정 뷰</h2> <p>Android N부터는 알림 뷰를 사용자 지정할 수 있으며 알림 헤더, 동작 및 확장 가능한 레이아웃과 같은 시스템 장식을 계속 획득할 수 있습니다.</p> <p>이 기능을 활성화하기 위해, Android N에서는 다음과 같은 API를 추가하여 사용자 지정 뷰의 스타일을 지정합니다.</p> <dl> <dt> {@code DecoratedCustomViewStyle()}</dt> <dd> 미디어 알림 이외의 스타일 알림.</dd> <dt> {@code DecoratedMediaCustomViewStyle()}</dt> <dd> 스타일 미디어 알림.</dd> </dl> <p>이 새로운 API를 사용하려면, {@code setStyle()} 메서드를 호출하여, 원하는 사용자 지정 뷰 스타일에 전달합니다.</p> <p>이 조각에서는 {@code DecoratedCustomViewStyle()} 메서드로 사용자 지정 알림 객체를 구성하는 방법을 보여줍니다.</p> <pre> Notification notification = new Notification.Builder() .setSmallIcon(R.drawable.ic_stat_player) .setLargeIcon(albumArtBitmap)) .setCustomContentView(contentView); .setStyle(new Notification.DecoratedCustomViewStyle()) .build(); </pre> <h2 id="style">메시징 스타일</h2> <p> Android N에서는 알림 메시지의 스타일을 사용자 지정하기 위한 새로운 API를 도입했습니다. <code>MessageStyle</code> 클래스를 사용하면 대화 제목, 추가 메시지 및 알림에 대한 콘텐츠 뷰를 비롯하여 알림 메시지에 표시되는 여러 가지 레이블을 변경할 수 있습니다. </p> <p> 다음 코드 조각에서는 <code>MessageStyle</code> 클래스를 사용하여 알림 스타일을 사용자 지정하는 방법을 보여 줍니다. </p> <pre> Notification notification = new Notification.Builder() .setStyle(new Notification.MessagingStyle("Me") .setConversationTitle("Team lunch") .addMessage("Hi", timestamp1, null) // Pass in null for user. .addMessage("What's up?", timestamp2, "Coworker") .addMessage("Not much", timestamp3, null) .addMessage("How about lunch?", timestamp4, "Coworker")); </pre>