page.title=Notificações page.tags=notificações helpoutsWidget=true page.image=/preview/images/notifications-card.png trainingnavtop=true @jd:body <div id="qv-wrapper"> <div id="qv"> <!-- table of contents --> <h2>Este documento inclui</h2> <ol> <li><a href="#direct">Resposta direta</a></li> <li><a href="#bundle">Notificações empacotadas</a></li> <li><a href="#custom">Visualizações personalizadas</a></li> <li><a href="#style">Estilo de mensagem</a></li> </ol> </div> </div> <p>O Android N introduz diversas APIs novas que permitem que aplicativos publiquem notificações altamente visíveis e interativas.</p> <p>O Android N estende a API de notificação {@link android.support.v4.app.RemoteInput} atual para permitir respostas em linha em celulares. Esse recurso permite que os usuários respondam rapidamente na aba de notificações sem acessar o aplicativo.</p> <p> O Android N permite empacotar notificações semelhantes para exibição como única notificação. Para que isso seja possível, o Android N usa o método {@link android.support.v4.app.NotificationCompat.Builder#setGroup NotificationCompat.Builder.setGroup()} existente. Os usuários podem expandir todas as notificações, executando ações como responder e descartar em cada uma delas individualmente na aba de notificações. </p> <p>Por fim, o Android N também adiciona várias APIs que permitem usar decorações do sistema nas visualizações de notificação personalizadas do aplicativo. Essas APIs ajudam a garantir que as visualizações de notificação compartilhem uma apresentação consistente com os modelos padrão.</p> <p>Este documento destaca algumas principais mudanças que você deve considerar ao usar os novos recursos de notificação em aplicativos.</p> <h2 id="direct">Resposta direta</h2> <p>Com o recurso de resposta direta no Android N, os usuários podem responder rapidamente a mensagens de texto ou atualizar listas de tarefas diretamente na interface de notificação. Em um dispositivo portátil, a ação de resposta em linha aparece como botão adicional anexado à notificação. Quando um usuário responde pelo teclado, o sistema anexa a resposta de texto à intenção especificada como ação de notificação e envia a intenção ao aplicativo no dispositivo. <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>Figura 1.</strong>O Android N adiciona o botão de ação <strong>Reply</strong> . </p> <h3>Adição de ações de resposta em linha</h3> <p>Para criar uma ação de notificação com suporte à resposta direta: </p> <ol> <li>Crie uma instância de {@link android.support.v4.app.RemoteInput.Builder} que possa ser adicionada à ação de notificação. O construtor dessa classe aceita uma string, usada pelo sistema como chave da entrada de texto. Posteriormente, o aplicativo no dispositivo usará essa chave para recuperar o texto da entrada. <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>Anexe o objeto {@link android.support.v4.app.RemoteInput} a uma ação usando <code>addRemoteInput()</code>. <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>Aplique a ação a uma notificação e emita a notificação. <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> O sistema solicita que o usuário informe uma resposta quando acionar a ação de notificação. </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>Figura 2.</strong> O usuário insere texto na aba de notificações. </p> <h3> Recuperação da entrada do usuário na resposta em linha </h3> <p> Para receber a entrada do usuário da interface de notificação para a atividade declarada na intenção de ação de resposta: </p> <ol> <li>Chame {@link android.support.v4.app.RemoteInput#getResultsFromIntent getResultsFromIntent()} passando a intenção da ação de notificação como parâmetro de entrada. Esse método retorna um {@link android.os.Bundle} que contém a resposta de texto. <pre> Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); </pre> </li> <li>Consulte a resposta usando a chave de resultado (fornecida ao construtor {@link android.support.v4.app.RemoteInput.Builder}). Você pode concluir este processo e recuperar o texto de entrada criando um método, como no snippet de código a seguir: <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>Crie e emita outra notificação usando o mesmo código que você forneceu para a notificação anterior. O indicador de progresso desaparece da interface de notificação para informar os usuários que houve uma resposta bem-sucedida. Ao trabalhar com esta nova notificação, use o contexto que é passado ao método {@code onReceive()} do receptor. <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> Para aplicativos interativos, como bate-papos, pode ser útil incluir contexto adicional ao lidar com texto recebido. Por exemplo, estes aplicativos podem exibir várias linhas de histórico de bate-papo. Quando o usuário responde por {@link android.support.v4.app.RemoteInput}, você pode atualizar o histórico de respostas usando o método {@code setRemoteInputHistory()}. </p> <p> A notificação precisará ser atualizada ou cancelada depois que o aplicativo tiver recebido a entrada remota. Quando o usuário responde a uma atualização remota usando uma Resposta direta, não cancele a notificação. Em vez disso, atualize a notificação para exibir a resposta do usuário. Para notificações que usam {@code MessagingStyle}, adicione a resposta como última mensagem. Ao usar outros modelos, você pode anexar a resposta do usuário ao histórico da entrada remota. </p> <h2 id="bundle">Notificações empacotadas</h2> <p>O Android N oferece aos desenvolvedores uma nova forma de representar uma fila de notificações: <i>notificações empacotadas</i>. Essa forma é semelhante ao recurso <a href="{@docRoot}training/wearables/notifications/stacks.html">Pilhas de Notificações</a> no Android Wear. Por exemplo, se o aplicativo criar notificações para mensagens recebidas, quando mais de uma mensagem for recebida, empacote as notificações como um único grupo. Você pode usar o método existente {@link android.support.v4.app.NotificationCompat.Builder#setGroup Builder.setGroup()} para empacotar notificações semelhantes.</p> <p> Um grupo de notificações impõe uma hierarquia nas notificações que o compõe. Na parte superior dessa hierarquia, está a notificação pai, que exibe informações resumidas para o grupo. O usuário pode expandir progressivamente o grupo de notificações e o sistema mostra mais informações à medida que o usuário aumenta o detalhamento. Quando o usuário expande o pacote, o sistema revela mais informações para todas as notificações filhas. Quando o usuário expande uma das notificações, o sistema revela todo o seu conteúdo. </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>Figura 3.</strong> O usuário pode expandir progressivamente o grupo de notificações. </p> <p class="note"> <strong>Observação:</strong> Se o mesmo aplicativo enviar quatro ou mais notificações e não especificar um agrupamento, o sistema as agrupará automaticamente. </p> <p>Para saber como adicionar notificações a um grupo, consulte <a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">Adicionar cada notificação a um grupo</a>.</p> <h3 id="best-practices">Práticas recomendadas para notificações empacotadas</h3> <p>Esta seção oferece diretrizes sobre quando usar grupos de notificações em vez de notificações {@link android.app.Notification.InboxStyle InboxStyle} que foram disponibilizadas em versões anteriores da plataforma Android.</p> <h3>Quando usar notificações empacotadas</h3> <p>Você deve usar grupos de notificações apenas quando todas as condições a seguir forem verdadeiras para o seu caso de uso:</p> <ul> <li>As notificações filhas são notificações completas e podem ser exibidas individualmente sem necessidade de um resumo do grupo.</li> <li>A exibição individual de notificações filhas pode ser vantajosa. Por exemplo: </li> <ul> <li>Elas são acionáveis, sem ações específicas para cada filha.</li> <li>Há mais informações na filha que as que o usuário quer ler.</li> </ul> </ul> <p>Os exemplos de bons casos de uso para grupos de notificações incluem: um aplicativo de mensagens exibindo uma lista de mensagens recebidas ou um aplicativo de e-mail exibindo uma lista de e-mails recebidos.</p> <p> Os exemplos de casos em que uma única notificação é preferível incluem mensagens individuais de uma única pessoa ou uma representação em lista de itens de texto com uma única linha. Você pode usar ({@link android.app.Notification.InboxStyle InboxStyle} ou {@link android.app.Notification.BigTextStyle BigTextStyle}) para isso. </p> <h3 id ="post">Exibição de notificações empacotadas</h3> <p> O aplicativo deve sempre publicar um resumo do grupo, mesmo se o grupo tiver apenas uma única filha. O sistema suprimirá o resumo e exibirá diretamente a notificação filha se ela contiver apenas uma única notificação. Isso garante que o sistema possa oferecer uma experiência consistente quando o usuário deslizar por filhas de um grupo. </p> <p class="note"> <strong>Observação:</strong> esta versão do Android N ainda não elimina o resumo de grupos de notificações contendo uma única filha. Essa funcionalidade será adicionada em uma versão posterior do Android N. </p> <h3>Observação de notificações</h3> <p>Embora o sistema normalmente exiba notificações filhas como grupo, você pode configurá-las para exibição temporária como <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up"> notificações heads-up</a>. Esse recurso é particularmente útil porque permite acesso imediato à filha mais recente e a suas ações associadas. </p> <h3>Compatibilidade com versões anteriores</h3> <p> Os grupos de notificações e as entradas remotas fazem parte da API {@link android.app.Notification} desde o Android 5.0 (nível da API 21) para oferecer suporte a dispositivos Android Wear. Se você já criou notificações com essas APIs, a única ação necessária é verificar se o comportamento do aplicativo corresponde às diretrizes descritas acima e considerar a implementação de {@code setRemoteInputHistory()}. </p> <p> Para compatibilidade com versões anteriores, as mesmas APIs estão disponíveis com a classe {@link android.support.v4.app.NotificationCompat} da biblioteca de suporte, permitindo criar notificações que funcionem em versões anteriores do Android. Em celulares e tablets, os usuários somente visualizam as notificações resumidas. Portanto, um aplicativo deve ter uma notificação no estilo de caixa de entrada ou equivalente, representativa de todo o conteúdo de informações do grupo. Como os dispositivos Android Wear permitem que os usuários vejam todas as notificações filhas, mesmo em níveis de plataforma antigos, você deve criar notificações filhas independentemente do nível da API. </p> <h2 id="custom"> Visualizações personalizadas</h2> <p>Começando com o Android N, é possível personalizar visualizações de notificação e continuar obtendo decorações de sistema, como cabeçalhos de notificação, ações e layouts expansíveis.</p> <p>Para ativar esses recursos, o Android N adiciona as seguintes APIs para aplicar estilo à visualização personalizada:</p> <dl> <dt> {@code DecoratedCustomViewStyle()}</dt> <dd> Aplica estilo a notificações que não sejam notificações de mídia.</dd> <dt> {@code DecoratedMediaCustomViewStyle()}</dt> <dd> Aplica estilo a notificações de mídia.</dd> </dl> <p>Para usar essa nova API, chame o método {@code setStyle()}, passando o estilo de visualização personalizada desejado.</p> <p>O snippet mostra como construir um objeto de notificação personalizada com o método {@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">Estilo de mensagens</h2> <p> O Android N traz uma nova API para personalização do estilo de uma notificação. Usando a classe <code>MessageStyle</code>, você pode alterar vários rótulos exibidos na notificação, incluindo o título da conversa, mensagens adicionais e a visualização de conteúdo para a notificação. </p> <p> O seguinte snippet de código demonstra como personalizar o estilo de uma notificação usando a classe <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>