page.title=Notificações page.tags=notificações helpoutsWidget=true page.image=/preview/images/notifications-card.png trainingnavtop=true @jd:body
O Android N introduz diversas APIs novas que permitem que aplicativos publiquem notificações altamente visíveis e interativas.
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.
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.
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.
Este documento destaca algumas principais mudanças que você deve considerar ao usar os novos recursos de notificação em aplicativos.
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.
Figura 1.O Android N adiciona o botão de ação Reply .
Para criar uma ação de notificação com suporte à resposta direta:
// 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();
addRemoteInput()
.
// 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();
// 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);
O sistema solicita que o usuário informe uma resposta quando acionar a ação de notificação.
Figura 2. O usuário insere texto na aba de notificações.
Para receber a entrada do usuário da interface de notificação para a atividade declarada na intenção de ação de resposta:
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
// 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; }
// 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);
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()}.
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.
O Android N oferece aos desenvolvedores uma nova forma de representar uma fila de notificações: notificações empacotadas. Essa forma é semelhante ao recurso Pilhas de Notificações 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.
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.
Figura 3. O usuário pode expandir progressivamente o grupo de notificações.
Observação: Se o mesmo aplicativo enviar quatro ou mais notificações e não especificar um agrupamento, o sistema as agrupará automaticamente.
Para saber como adicionar notificações a um grupo, consulte Adicionar cada notificação a um grupo.
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.
Você deve usar grupos de notificações apenas quando todas as condições a seguir forem verdadeiras para o seu caso de uso:
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.
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.
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.
Observação: 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.
Embora o sistema normalmente exiba notificações filhas como grupo, você pode configurá-las para exibição temporária como notificações heads-up. Esse recurso é particularmente útil porque permite acesso imediato à filha mais recente e a suas ações associadas.
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()}.
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.
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.
Para ativar esses recursos, o Android N adiciona as seguintes APIs para aplicar estilo à visualização personalizada:
Para usar essa nova API, chame o método {@code setStyle()}, passando o estilo de visualização personalizada desejado.
O snippet mostra como construir um objeto de notificação personalizada com o método {@code DecoratedCustomViewStyle()}.
Notification notification = new Notification.Builder() .setSmallIcon(R.drawable.ic_stat_player) .setLargeIcon(albumArtBitmap)) .setCustomContentView(contentView); .setStyle(new Notification.DecoratedCustomViewStyle()) .build();
O Android N traz uma nova API para personalização do estilo de uma notificação.
Usando a classe MessageStyle
, 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.
O seguinte snippet de código demonstra como personalizar o estilo de uma
notificação usando a classe MessageStyle
.
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"));