Android N Notification Direct Reply

前言

Android N 牛轧糖来了,其中一项界面的重要变化就是通知栏可以直接回复,对于对话型的应用来说,这个功能是非常的方便和实用。本文简单介绍一下如何去实现这一功能。

核心

技术介绍跟党走吐舌头, 一个中心,三个基本点。

一个中心: RemoteInput

三个基本点:

  • 设置群组; 
  • 设置群组描述; 
  • 更新。

一个中心 RemoteInput

此处代码借鉴android官网 https://developer.android.com/preview/features/notification-updates.html
1. 创建一个RemoteInput对象 用于接收用户输入
// 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();
2. 将这个对象放入notification 的action
// 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();
注意: 这个输入会由谁来处理?答案是:你需要在replayPendingIntent中指定。如何指定,以下是示例代码:
Intent replyIntent = new Intent(context, QuickReplyActivity.class);

PendingIntent replyPendingIntent = PendingIntent.getActivity(context, 0,
                    replyIntent, PendingIntent.FLAG_UPDATE_CURRENT);

3. 将action放入notication, 并且发送之。
// 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);

看下界面效果,至于这颜色文字要怎么去设置,后面会介绍一下。


4. 接收用户输入 RemoteInput.getResultsFromIntent
这段代码放在那里? 答案是: 就放在你定义的QuickReplyActivity.java中,具体可以直接放到onCreate去处理, getIntent就可以获取到相应的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;
 }
这样你就获得了用户的输入。

5. 使用同样的ID 更新一下通知
// 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);

三个基本点

一般的应用绝不仅仅只有一个通知,比如邮件和短信,会有很多的通知过来。这些通知需要统一用一个群组来管理,这样用户可以非常方便地展开。

基本点之一 设置群组 

每个通知都需要设置群组
Notification.Builder noti = new Notification.Builder(context)
                    .setWhen(System.currentTimeMillis())
                    .setGroup(GROUP_KEY_APP);
static final String GROUP_KEY_MMS = "group_key_xxx";

基本点之二 设置群组描述

在所有的通知都发送出去之后,或者之前,你需要再发送一个通知,这个通知比较特别,它是对整个通知的一个描述, 重要的是,它带有setGroupSummary();

final Notification.Builder noti = new Notification.Builder(context)
                    .setWhen(System.currentTimeMillis())
                    .setGroup(GROUP_KEY_APP)
                    .setGroupSummary(true);

如果不发会怎么样? 呵呵,不发你就会发现你的状态栏出现了很多该应用通知的icon,因为缺少唯一的管理者。

看下界面效果:

基本点之三 更新

更新什么?更新你使用RemoteInput 回复的那个通知,这一点是谷歌特别要求的。
不更新会怎么样? 吐舌头 答案是: 你无法cancel这个通知。
至于如何更新,请参照前面的介绍。

建议

Android官网会建议开发者去给不同的通知设置不同的ID, 只要群组是唯一的即可,这样对于ID的生成和管理比较麻烦, 这里推荐使用TAG。
同类的通知使用同一个ID, 但是TAG不同,TAG完全可以根据APP自身为每个ITEM的编号来进行设置(举个例子:com.android.xxapp:item1, om.android.xxapp:item2...)
notificationManager.notify(notificationTag, notificationId, notification);
后续对于notification的cancel和更新,使用TAG都会非常方便。

界面

1. 通知栏的颜色 
        Notification.Builder noti = new Notification.Builder(context)
                .setWhen(System.currentTimeMillis())
                .setColor(mContext.getResources().getColor(R.color.colorAccent));
注意一下:这个颜色是统一的,一旦设置你会发现输入的部分和标题都是同样的颜色。包括icon,也会透出同样的颜色。
2. 回复的部分显示出来的'Type Message' 这个字符串来自于setLabel(“Type Message”)


申明: 此文章属于个人文章, 供大家讨论学习,请不要未经本人同意随便转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值