Android N 通知

来源:互联网 发布:辉煌中国纪录片知乎 编辑:程序博客网 时间:2024/06/06 05:57

Android N 引入了一些新 API,允许应用发布具有高度可见性和交互性的通知。

Android N 扩展了现有 RemoteInput 通知 API,以支持手持式设备上的内联回复。 此功能允许用户从通知栏快速进行回复,无需访问应用。

此外,Android N 还允许捆绑类似的通知并将它们显示为一则通知。 为了实现此功能,Android N 使用现有的 NotificationCompat.Builder.setGroup() 方法。用户可以从通知栏展开各通知,并分别对每则通知进行回复和清除等操作。

最后,Android N 还添加了一些新 API,允许您在应用的自定义通知视图中使用系统装饰元素。 这些 API 可帮助确保通知视图与标准模板的展示效果相一致。

本文重点介绍您在应用中使用新通知功能时应加以考虑的一些重要变更。
直接回复
利用 Android N 中的直接回复功能,用户可以直接在通知界面内快速回复短信或更新任务列表。 在手持式设备上,可通过通知中另外附加的按钮进行内联回复操作。 当用户通过键盘回复时,系统会将文本回复附加到您为通知操作指定的 Intent,并将 Intent 发送到手持式设备应用。
添加内联回复操作
要创建支持直接回复的通知操作:

1.创建一个可添加到通知操作的 RemoteInput.Builder 实例。 该类的构造函数接受系统用作文本输入密钥的字符串。 之后,手持式设备应用使用该密钥检索输入的文本。

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();

2.使用 addRemoteInput() 向操作附加 RemoteInput 对象。

Notification.Action action =        new Notification.Action.Builder(R.drawable.ic_reply_icon,                getString(R.string.label), replyPendingIntent)                .addRemoteInput(remoteInput)                .build();

3.对通知应用操作并发出通知。

Notification newMessageNotification =        new Notification.Builder(mContext)                .setSmallIcon(R.drawable.ic_message)                .setContentTitle(getString(R.string.title))                .setContentText(getString(R.string.content))                .addAction(action))                .build();NotificationManager notificationManager =        NotificationManager.from(mContext);notificationManager.notify(notificationId, newMessageNotification);

从内联回复检索用户输入
要从通知界面接收用户输入并发送到在回复操作的 Intent 中声明的 Activity:

1.通过传递通知操作的 Intent 作为输入参数来调用 getResultsFromIntent()。 该方法返回含有文本回复的 Bundle。

Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);

2.使用产生的密钥查询捆绑包(提供给 RemoteInput.Builder 构造函数)。以下代码段说明了方法如何从捆绑包检索输入文本:

private CharSequence getMessageText(Intent intent) {    Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);    if (remoteInput != null) {        return remoteInput.getCharSequence(KEY_TEXT_REPLY);    }    return null; }

3.使用您为上一项通知提供的相同的通知 ID 来建立和发布另一项通知。 进度指示器从通知界面消失,以告知用户已回复成功。 在处理这项新通知时,使用被传递到接收器 onReceive() 方法的上下文。

Notification repliedNotification =        new Notification.Builder(context)                .setSmallIcon(R.drawable.ic_message)                .setContentText(getString(R.string.replied))                .build();NotificationManager notificationManager =        NotificationManager.from(context);notificationManager.notify(notificationId, repliedNotification);

对于交互式应用(例如聊天),这可以用来在处理检索到的文本时添加其他上下文。 例如,这些应用可以显示多行聊天记录。 当用户通过 RemoteInput 回复时,您可以使用 setRemoteInputHistory() 方法更新回复历史。

在应用收到远程输入后,必须更新或取消通知。 如果用户使用直接回复来对远程更新进行回复,则不可取消通知。 否则,更新通知以显示用户的回复。对于使用 MessagingStyle 的通知,您应该添加回复来作为最新消息。 当使用其它模板时,您可以将用户的回复追加到远程输入历史。

捆绑通知
Android N 为开发者提供了表示通知队列的新方法: 捆绑通知。这类似于 Android Wear 中的通知堆栈功能。 例如,如果应用为接收的消息创建通知,那么在接收到多个消息时,应用会将通知捆绑在一起成为一个群组。 您可以使用现有的 Builder.setGroup() 方法捆绑类似的通知。

通知组对组内的通知施加层次结构。 层次结构的顶层是父级通知,其显示该群组的摘要信息。 用户可以逐步展开通知组,随着用户深入展开,系统将显示更多信息。 当用户展开捆绑包时,系统将显示其所有子通知的更多信息;当用户展开其中一则通知时,系统显示该通知的所有内容。
捆绑通知最佳做法
本节提供了有关何时使用通知组而非早期版本 Android 平台中的 InboxStyle 通知的指南。

何时使用捆绑通知
只有在您的用例满足以下所有条件时才应使用通知组:

子通知为完整通知,且可以单独显示,无需群组摘要。
单独显示子通知更合理。例如:
子通知可操作,且每个子通知均有特定的操作。
子通知中包含用户想要查看的更多信息。
好的通知组用例示例包括:显示传入消息列表的短信应用,或显示收到的电子邮件列表的电子邮件应用。

适合显示单一通知的用例示例包括:从某一个人收到的单独消息,或以列表表示的单行文本项目。 您可以使用 InboxStyle 或 BigTextStyle 实现此功能。

显示捆绑通知
即使组内仅含有一则子通知,应用也应发布组摘要。 如果只含有一则通知,系统将取消摘要并直接显示子通知。 这样可确保用户在滑动切换组内的子通知时,系统仍可以提供一致的用户体验。

扫视通知
虽然系统通常以群组的方式显示子通知,但您可以进行设置,使其暂时作为浮动通知显示。 该功能非常实用,因为其允许用户立即访问最近的子通知以及与其相关的操作。

后向兼容性
自 Android 5.0(API 级别 21)起,Notification API 中就添加了通知组和远程输入,以支持 Android Wear 设备。 如果您已经使用这些 API 构建通知,则只需验证应用行为是否符合上述指南,并考虑实现 setRemoteInputHistory()。

为了支持后向兼容性,支持库的 NotificationCompat 类中提供了相同的 API,以便您构建可在早期 Android 版本中运行的通知。 在手持式设备和平板电脑上,用户只能看到摘要通知,因此应用应仍提供收件箱式或类似形式的通知显示模式,以显示群组的全部信息内容。 鉴于 Android Wear 设备允许用户查看所有子通知,包括更早级别平台上的通知,您应在不依赖 API 级别的基础上构建子通知。

自定义视图
从 Android N 开始,您将可以自定义通知视图,同时仍可以使用系统装饰元素,例如通知标头、操作和可展开的布局。

为启用该功能,Android N 添加了以下 API,以便您样式化自己的自定义视图:

DecoratedCustomViewStyle()
样式化除媒体通知外的其他通知。
DecoratedMediaCustomViewStyle()
样式化媒体通知
如需使用这些新 API,可调用 setStyle() 方法,并向其传递所需的自定义视图样式。

此代码段显示了如何使用 DecoratedCustomViewStyle() 方法构建自定义通知对象。

Notification notification = new Notification.Builder()           .setSmallIcon(R.drawable.ic_stat_player)           .setLargeIcon(albumArtBitmap))           .setCustomContentView(contentView);           .setStyle(new Notification.DecoratedCustomViewStyle())           .build();

消息传递样式
Android N 引入了一项新的 API 来自定义通知样式。 使用 MessageStyle 类,您可以更改在通知中显示的多个标签,包括会话标题、其他消息和通知的内容视图。

以下代码段演示了如何使用 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"));
0 0
原创粉丝点击