本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发。

这是<是时候来了解android7>系列的第三篇文章了, 前面两篇分别介绍了多窗口模式shortcut功能, 今天我们来点简单的, 说一说通知直接回复功能. 可能很多朋友还没有机会接触到android7的新特性, 所以在开始之前,先来介绍一下什么是通知直接回复, 拿短信应用来说吧, 在之前我们接收到一条新短信是会有一个通知提醒的, 不过假如我们想要回复该短信就要点击短信应用或者点击通知进入到短信内容里才可以, 甚是麻烦. 从android7开始, 我们不用这么麻烦了, 可以直接在通知里进行回复了!好像iOS和一些国产的ROM早就有了这项功能, 不过在原生Android里这是第一次, 这个特性既方便了用户, 同时也方便了我们开发者. 来张图感受一下.

这就是我们今天要完成的一个小demo, 先来说一下这个demo的流程, 首先, 我们点击”发通知”会模拟发出一个短信通知, 然后当我们编辑完回复内容点击发送的时候, 会启动一个service来模拟发送短信发送过程, 这个模拟过程首先会有一个延迟, 延迟后继续发送一个”发送成功”的通知, 最后将通知取消掉.

流程很简单, 整个都是模拟的过程, 最主要的是要学习一个直接回复这项新功能.

那重点来了? 如何发送一个带有直接回复功能的通知呢? 下面再来整理一下发送这样的一个通知的流程:

  1. 第一步, 我们需要创建一个RemoteInput
  2. 第二步, 创建一个PendingIntent, 这个PendingIntent指当我们点击”发送”的时候调用什么
  3. 第三步, 创建一个直接回复的Action
  4. 第四步, 创建notification
  5. 第五步, 发送通知

一共5个步骤我们就可以创建一个带有”直接回复”功能的通知了, 而且这5步里2,4,5应该是我们熟悉的代码, 下面我们就来一步步的完成代码.

首先, 创建RemoteInput

RemoteInput remoteInput = new RemoteInput.Builder(RESULT_KEY).setLabel("回复这条消息").build();

很简单的一个builder, 首先Builder的构造我们需要一个String类型的key, 这个key是干嘛用的? 其实就是我们方便在处理回复的时候拿内容的. 其次一个setLabel方法, 可以对照着上面的图来看看这是哪一部分的内容, 说白了, 这其实就是一个EditTextHint值.

接下来继续第二步, 创建一个PendingIntent, 这个PendingIntent在这里的作用是启动一个service,所以代码是这样的:

Intent intent = new Intent(this, SendMsgService.class);
PendingIntent pi = PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);

都是大家熟悉的代码, 我们接着来看第三步, 创建一个直接回复的Action

NotificationCompat.Action act = new NotificationCompat.Action.Builder(R.mipmap.ic_launcher, "回复", pi).addRemoteInput(remoteInput).build();

又是一个Builder, 这个Builder的构造中有三个参数, 第一个参数是一个logo, 搞过通知的朋友肯定对通知的logo都很熟悉了, 第二个参数是这个Action的标签, 对应上面demo中我们要点击的那个按钮, 第三个参数是当我们点击”回复”的时候要干嘛. 接下来一个addRemoteInput方法将上面我们创建的RemoteInput传递进来.

第四步, 创建一个notification, 这个过程中大家都知道也是一个builder, 不过这个builder中肯定有我们不熟悉的方法, 要们上面的Action怎么设置呢?

NotificationCompat.Builder builder = new NotificationCompat.Builder(this).setSmallIcon(R.mipmap.ic_launcher).setContentTitle("请问是否需要信用卡?").setContentText("您好,我是XX银行的XX经理, 请问你需要办理信用卡吗?").setColor(Color.CYAN).addAction(act).setCategory(Notification.CATEGORY_MESSAGE);

从上往下一个个的来, 略…略…略…, setColor方法的作用是设置一个accent颜色, 对应上面的demo就是那个”回复”和点击”回复”后输入框的背景颜色. addAction方法就是将我们上面创建的Action设置进来, setCategory是指定通知的类型, 这里我们指定为消息类型.

最后一步, 发送通知

NotificationManager nm = getSystemService(NotificationManager.class);
nm.notify(NOTIFICATION_ID, builder.build());

没撒好说的, 就这样简单的几步, 一个具有”直接回复”功能的通知就发出来了, 不过还没完, 虽然通知出来了, 但是用户回复的内容我们还没处理. 这些逻辑的处理我们放到上面提到的那个service里执行.

那这个处理流程是怎样的呢? 还是先来罗列下流程.

  1. 拿到用户输入的内容
  2. 模拟发送的延迟
  3. 模拟发送成功, 取消通知

再次一步步的跟代码, 首先我们要拿到用户输入的内容, 我们可以通过RemoteInput的一个静态方法getResultsFromIntent直接拿到一个Bundle, 然后我们就可以根据上面构建RemoteInput的时候使用的key来拿到内容了.

Bundle replyBundle = RemoteInput.getResultsFromIntent(intent);
if (replyBundle != null) {// 根据key拿到回复的内容String reply = replyBundle.getString(MainActivity.RESULT_KEY);reply(reply);
}

拿到内容后, 我们就来模拟回复了, 这个操作是在reply方法中完成的.

private void reply(final String reply) {mHandler.postDelayed(new Runnable() {@Overridepublic void run() {Log.d("reply", "reply: " + reply);onReply();}}, 1000);
}
}

这里我们延迟1000ms后表示回复成功, 然后调用onReply方法.

private void onReply() {final NotificationManager nm = getSystemService(NotificationManager.class);mHandler.post(new Runnable() {@Overridepublic void run() {// 更新通知为“回复成功”Notification notification = new NotificationCompat.Builder(SendMsgService.this).setSmallIcon(R.mipmap.ic_launcher).setContentText("回复成功").build();nm.notify(MainActivity.NOTIFICATION_ID, notification);}});// 最后将通知取消mHandler.postDelayed(new Runnable() {@Overridepublic void run() {nm.cancel(MainActivity.NOTIFICATION_ID);}}, 2000);
}

onReply里我们就来干剩下的事了, 包括发送一个”发送成功”的消息,然后延迟取消通知.

代码很简单, 主要的是创建直接回复的通知如何拿到用户输入的内容, 如果大家的APP中有这样的需求, 可以考虑在适配Android7的时候加入直接回复的功能.

最后来一个题外话, 从Android5开始, 其实Android还提供了一个悬浮式通知的功能, 这个悬浮式通知其实也很简单, 只需要在构建Notification的时候使用setFullScreenIntent(PendingIntent pi, boolean highPriority)即可实现, 现在Android7最新的短信应用就是结合了悬浮式通知直接回复的功能, 不过我自己在实现的时候还是遇到了一些问题, 例如: 如何控制悬浮式通知的消失, 如何控制悬浮式通知消失后发出一个普通通知, 这两个问题我的做法是发出一个悬浮式通知后, 使用Handler延迟发送一个普通通知, 但这样还是有一个问题, 在悬浮式通知进行直接回复时, 通知可能就已经被取消了, 这里我还没有找到google短信源码看它是怎么处理的, 如果大家有知道原生消息是怎么处理的或者从哪可以找到google原生短信应用的源码可以在下面给我留言, 谢谢~

最近给出我的demo源码: https://github.com/qibin0506/N_notification_quick_reply

是时候来了解android7了:通知直接回复相关推荐

  1. 搜集整理的一些博客导航

    简介:第一次在CSDN上发表博客,将自己关注或者看过的一些博客整理了一下,其中包含了鸿神和郭神的全部博客,包括两位大神微信公众号推荐的博客,另外还有一些安卓开发社区的博客,后续每天都会更新这个导航,希 ...

  2. Android 常用开发功能 博客导航

    转载地址:http://blog.csdn.net/ciqing123/article/details/52931663?locationNum=16&fps=1 简介:第一次在CSDN上发表 ...

  3. 关于CSDN不给任何通知强制关闭我的6年博客,我深表痛心

    关于CSDN不给任何通知强制关闭我的6年博客,我深表痛心. 最近有很长一段时间没有去csdn博客了, 前几天去看的时候发现博客被封闭了. 我联系了管理员,但是没有得到任何回复. 我猜想,可能是不是我在 ...

  4. 【Interfacenavigation】通知概述(36)

    原 通知是Android在应用的UI外显示的消息,用于向用户提供提醒,来自其他人的通信或来自应用的其他及时信息.用户可以点按通知以打开您的应用或直接从通知中采取操作. 此页面概述了通知的显示位置和可用 ...

  5. android9 前台服务通知_Android通知概览

    通知是指 Android 在应用界面之外显示的消息,旨在向用户提供提醒.来自他人的通信信息或应用中的其他及时信息.用户可以点按通知来打开应用,或直接从通知中执行操作. 此页面将概述通知的显示位置和可用 ...

  6. android通知悬浮通知_Android通知直接回覆

    android通知悬浮通知 Android Notification Direct Reply action lets us reply to the notification message, it ...

  7. Android10.0通知Notification的使用这一篇就够了

    文章目录 前言 通知概述 不同android版本上通知功能 通知的结构 创建通知 1.创建渠道 2.设置点击事件 3.构造Notification对象并显示通知 通知的操作 1.添加操作按钮 2.添加 ...

  8. Android N Preview Notification API (通知)

    通知 本文内容 直接回复 捆绑通知 自定义视图 Android N 引入了一些新 API,允许应用发布具有高度可见性和交互性的通知. Android N 扩展了现有 RemoteInput 通知 AP ...

  9. DingTalk钉钉消息通知

    开发文档:Link 钉钉消息通知简单分为单纯的消息通知(没有回复) 和 会话. 1.自定义机器人开发通知不需要sdk包. <?php function request_by_curl($remo ...

最新文章

  1. loadrunner关联点总结
  2. iOS App 上架(Analysis 工具使用)
  3. DR模式 mysqlABB读写分离
  4. PHP 7安装使用体验,升级PHP要谨慎
  5. Linux下的分区工具
  6. VS的TFS版本控制的使用总结
  7. 论文浅尝 | 基于图匹配神经网络的跨语言知识图对齐 (ACL 2019)
  8. mysql数据库优化语句_mysql数据库优化语句
  9. python下载邮件附件_Python - 从电子邮件附件下载excel文件然后解析它
  10. 小巧Linux发行版本,老机器也不愁
  11. 查漏补缺:2020年搞定SpringCloud面试(含答案和思维导图)
  12. 剑指offer——3.实现数组中重复数字查找
  13. 大数据量下求均值的方法
  14. 计算机创业计划书800字大全,2017创业计划书范文800字
  15. DS4000系列存储配置storage manager介绍
  16. Norton企业版防毒服务器
  17. 老男孩python作业题_老男孩python学习第一天作业
  18. 堆栈的存取原则是什么?
  19. 微软浏览器Edge不能上网的解决办法
  20. 7-1 电话聊天狂人

热门文章

  1. Android客户端与PC服务器实现Socket通信
  2. Unity 中的基础光照
  3. networkx 判断两图是否同构 得到同构的节点映射
  4. jsp:使用jsp完成数据的分页显示
  5. [渗透]缓慢的HTTP拒绝服务攻击原理、利用和防范
  6. Java必备常见单词
  7. 7-13 寻找大富翁 (25分)
  8. 利用adobe acrobat裁剪PDF
  9. win10及VS2017安装配置mpich2
  10. L1和L2简单易懂的理解