Android直接回复通知

Android直接回复通知

通知直接回复

Android N/7.0

  • Android直接回复通知
    • 前言
    • 创建通知
      • 创建notification对象
      • 添加一个Action
      • 添加一个广播接收Action事件
      • 添加直接回复输入框
      • 把直接回复的内容发送到广播接收器
      • 结合Hands Up带来超棒的用户体验
    • Hands Up直接回复通知不消失的问题
    • 总结

前言

通知(Notification)可为是Android系统中富含特色的一个功能,从Android的第一个版本到Android N,通知这个功能也发生了巨大的变化,Google几乎每个版本对通知模块都做了更新升级,可见通知在Android系统中发挥了举足轻重的作用。在Android N中,通知模块做了如下更新:

  • 模板更新:我们正在更新通知模板,新强调了英雄形象和化身。开发者将能够充分利用新模板,只需进行少量的代码调整。
  • 消息传递样式自定义:您可以自定义更多与您的使用 MessagingStyle 类的通知相关的用户界面标签。您可以配置消息、会话标题和内容视图。
  • 捆绑通知:系统可以将消息组合在一起(例如,按消息主题)并显示组。用户可以适当地进行拒绝或归档等操作。如果您已实现 Android Wear 的通知,那么您已经很熟悉此模式。
  • 直接回复:对于实时通信应用,Android 系统支持内联回复,以便用户可以直接在通知界面中快速回复短信。
  • 自定义视图:两个新的 API 让您在通知中使用自定义视图时可以充分利用系统装饰元素,如通知标题和操作。

除开第四点直接回复是新功能以外,其它更新都是UI美观相关的。本文将会对Android N通知模块新加的新功能通知直接回复如何使用进行阐述。阐述这个功能之前,还是先了解一下UI方面的重大变化,整个通知的样式可以说已经发生了翻天覆地的变化,如下左图是老版本的通知的样式,右图是N版本的的通知样式:

这里写图片描述这里写图片描述

同样的通知在Android M和Android N上显示有这么大差别,Android N中多了一个应用的名称,这个是非常棒的一个更新,让用户能快快速辨别这是哪个APP的通知,对用户体验有很大的提升。

长按通知时,左图是老版本Android M的样式,右图是Android N的样式:

这里写图片描述 这里写图片描述

上图可见,长按通知时,Android N提供更加直接快速的通知设置,且现在也可以Block系统级别的应用的通知。对于用户体验而言,这些都是非常棒的细节更新。

好了,下面就进入正题吧,如果发一个直接回复的通知。

创建通知

由于本文是基于Android N的功能开发,所以本文中应用的一些类和方法都是以SDK的API level 24,如果在实际开发当中,如果读者开发的APP需要在低版本的Android系统,读者需要考虑一下兼容性而不能直接引用本文章中的例子的代码。如本文中应用Notification.Builder(Android 3.0),为了兼容低版本,应该使用版本 4 支持库中的 NotificationCompat.Builder

首先来回顾一下怎样创建一个普通的通知。创建一个通知,有些内容是可选的,有些内容是不可选的,因此,必需的通知内容:

  • 小图标,由 setSmallIcon() 设置
  • 标题,由 setContentTitle() 设置
  • 详细文本,由 setContentText() 设置

下面就开始吧

创建notification对象

运用notification的建造者模式,简单容易地创建notification对象,如下:

Notification notification = new Notification.Builder(this).setSmallIcon(Icon.createWithResource(this.getPackageName(),R.drawable.my_default_icon_label)).setContentText("You can reply on notification.").setContentTitle("Test Notification").build();

如上面的代码,这是一个仅包含了必须内容的Notification对象,由于这些代码都非常常用了,本文就不再过多的赘述。

添加一个Action

在Android 4.4的版本中,通知的更新升级就增加了Action功能,所谓Action功能,就是通知有一个或多个按钮可以点击。如下图:

这里写图片描述

实现代码就是调用addAction()方法,如下:

Notification notification = new Notification.Builder(this).setSmallIcon(Icon.createWithResource(this.getPackageName(), R.drawable.my_default_icon_label)).setContentText("You can reply on notification.").setContentTitle("Test Notification").setAutoCancel(true).addAction(new Notification.Action.Builder(null,"My Action",null).build()).build();

添加一个广播接收Action事件

当点击通知的Action按钮,把点击事件,发送给一个广播接收者,代码如下:

//创建一个启动广播的Intent
Intent quickIntent = new Intent();
quickIntent.setAction("quick.reply.input");
//创建Notification对象
Notification notification = new Notification.Builder(this).setSmallIcon(Icon.createWithResource(this.getPackageName(), R.drawable.my_default_icon_label)).setContentText("You can reply on notification.").setContentTitle("Test Notification").setAutoCancel(true)//点击通知时自动消失.addAction(new Notification.Action.Builder(null,"MyAction",//把Intent转换成PendingIntentPendingIntent.getBroadcast(this, 1, quickIntent,PendingIntent.FLAG_ONE_SHOT)).build()).build();
//创建广播接收器
BroadcastReceiver br = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {unregisterReceiver(this);}
};
//注册广播接收器
IntentFilter filter = new IntentFilter();
filter.addCategory(this.getPackageName());
filter.addAction("quick.reply.input");
registerReceiver(br, filter);

添加直接回复输入框

添加直接回复输入框,调用Notification.Action.Builder的addRemoteInput()方法,并创建一个RemoteInput对象作为参数,RemoteInput.Builder创建对象时传入参数key,该key就是输入框内容的key,在接收内容的地方通过key取得内容。如果没有key也可以取得内容,就需要先遍历所有的数据,先取得key,再取得内容。如下:

Notification notification = new Notification.Builder(this).setSmallIcon(Icon.createWithResource(this.getPackageName(),R.drawable.my_default_icon_label)).setContentText("You can reply on notification.").setContentTitle("Test Notification").setAutoCancel(true).addAction(new Notification.Action.Builder(null,"MyAction",PendingIntent.getBroadcast(this, 1, quickIntent,PendingIntent.FLAG_ONE_SHOT))//直接回复输入框,quick_notification_reply是key.addRemoteInput(new RemoteInput.Builder("quick_notification_reply").setLabel("Please input here!").build()).build()).build();

效果如下图:

这里写图片描述

把直接回复的内容发送到广播接收器

在广播中接收通知输入框的内容,并显示在APP的TextView上,实现如下:

BroadcastReceiver br = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {Bundle results = RemoteInput.getResultsFromIntent(intent);if (results != null) {CharSequence result = results.getCharSequence("quick_notification_reply");if (TextUtils.isEmpty(result)) {((TextView) findViewById(R.id.tv)).setText("no content");} else {((TextView) findViewById(R.id.tv)).setText(result);}}nm.cancelAll();unregisterReceiver(this);}
};

如上面的代码,通过RemoteInput的getResultsFromIntent()方法,把Intent中的输入框内容取出来,然后通过key以方法getCharSequence()取得输入框输入的内容,把内容显示在TextView上。

效果如下:

这里写图片描述

结合Hands Up带来超棒的用户体验

Android更新直接回复通知的功能,出于给用户便捷、快速的操作体验,但是用户也要下拉通知栏才能进行回复,如果用户正在使用设备,通过Heands Up就能把直接回复通知这个功能的便捷性淋漓尽致的体现出来。

与Hands Up结合,只需要在原本的基础上,设置setFullScreenIntent()即可,实现如下:

Notification notification = new Notification.Builder(this).setSmallIcon(Icon.createWithResource(this.getPackageName(), R.drawable.my_default_icon_label)).setContentText("You can reply on notification.").setContentTitle("Test Notification").setAutoCancel(true)//Hands Up.setFullScreenIntent(PendingIntent.getActivity(this, 1,                     quickIntent,PendingIntent.FLAG_ONE_SHOT), true).addAction(new Notification.Action.Builder(null,"MyAction",PendingIntent.getBroadcast(this, 1, quickIntent,PendingIntent.FLAG_ONE_SHOT))//直接回复输入框.addRemoteInput(new RemoteInput.Builder("quick_notification_reply").setLabel("Please input here!").build()).build()).build();

效果如下:

这里写图片描述

Hands Up直接回复通知不消失的问题

在Android 7.0的直接回复通知结合Hands Up一起使用时,当用户在输入框输入内容后,点击发送按钮时,应用调用NotificationManager.cancel()方法取消通知,发现通知还在通知栏,这时需要用户下拉通知栏,通知才会自动消失。这可能会给用户带来不好的用户体验。这个问题不是issue,是Android本身的设计,引用官方一段注释:

// A cancel() in repsonse to a remote input shouldn't be delayed, as it makes the sending look longer than it takes.

解决这个问题可以通过当用户在通知输入完成后,APP成功接收到通知输入的内容后,即APP认为该通知应该消失了,在调用NotificationManager.cancel()前,先更新通知,把通知的Hands Up特性去除,即去除setFullScreenIntent(),然后再调用NotificationManager.cancel()即可。

总结

本文阐述了Android N中更新的新功能直接回复通知,这个功能给用户带来方便、快速操作的特点,对于即时通讯、短信等功能非常有用。通过结合Hands Up通知,能真正发挥直接回复所带来的好处,无疑给用户带来超棒的使用体验。但是,目前快速回复通知只支持text,也就是纯文本,希望在以后能有更加丰富的类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/45390.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 实现微信,QQ的程序前后台切换:back键切换后台;点击通知栏恢复前台。

实现类似微信,QQ的前后台切换:back键切换后台;点击通知栏恢复前台。 1、back键切换后台的实现: 这个实现需要在主activity重写onbackpressed()方法。代码如下: Overridepublic void onBackPressed() {Intent intent…

Python源码学习笔记:Python虚拟机

Python虚拟机 注:本篇是根据教程学习记录的笔记,部分内容与教程是相同的,因为转载需要填链接,但是没有,所以填的原创,如果侵权会直接删除。此外,本篇内容大部分都咨询了ChatGPT,为笔…

Windows PyCharm 2022/2023 使用Centos7 的虚拟环境 venv 实现文件实时同步 代码代码Git自动识别 解决 Samba Cannot Save File 的问题

前期准备 git报错 fatal: unsafe repository 解决方法 因为是远程文件夹,老版本时没这个问题,新版本git或者pycharm有这个限制,不能自动识别更改的代码,报unsafe.directory的问题,直接暴力解决,加* git c…

接口间参数传递的一种解决方案

引言 做过接口自动化测试的同学肯定都熟悉在全链路测试过程中,很多业务场景的完成并非由单一接口实现,而是由很多接口组成的一条链路实现。例如你在淘宝上购物场景。 不同于单接口测试,这种链路型的接口自动化测试,由于接口间有参…

计算机应用设计大赛获奖信息,北京大学第六届“计算机应用设计大赛”圆满落幕...

6月6日下午,北京大学创新创意系列赛事颁奖典礼在英杰交流中心月光厅举行,会上颁发了计算机应用设计大赛、“挑战杯”系列竞赛、数学建模与计算机应用竞赛和“禁毒教育”创意大赛四项赛事的各类奖项。信息科学技术学院2013级本科生王迪作为获奖代表上台领…

魔物学院计算机,测试 | 你属于魔法学校什么学院的?

原标题:测试 | 你属于魔法学校什么学院的? 本Part长年主持:绿茶 本Part今日主人公:心理测试 如果你有机会在霍格沃茨魔法学校读书,依据你的性格,分院帽会把你分到哪个学院呢?你适合哪个学院呢?是高贵的斯莱特林,还是勇敢的格兰芬…

uniapp 微信小程序通过 wx.openCustomerServiceChat对接客服。

直接上解决方案,直接在绑定的方法中调用wx.openCustomerServiceChat 方法即可。 需要注意的几点。 hbuilder x 需升级到 3.4.3 版本以上。使用的,微信开发者工具中是看不到效果的,需要打包后,在微信中扫码查看。(体验…

微软丢出王炸:微软发布重磅更新Windows Copilot

在今天凌晨结束的微软 Build 2023 大会上,微软发布了重磅更新Windows Copilot. 微软此前把 GPT-4 接入Office 套件而推出的 Copilot,将全面集成到 Windows 系统。 Windows Copilot 注册直通: https:/forms.office.com/pages/responsepage.asp…

仿QQ聊天程序

仿QQ聊天程序 转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907 一、设计内容及要求 1.1综述 A.系统概述 我们要做的就是类似QQ这样的面向企业内部的聊天软件,基本功能和QQ类似。首先,系统分为两大部分,第一部分是…

仿微信语音聊天

如上图,是常见的仿微信的聊天程序,实现的效果如上图所示,由于项目太大,本文只讲录音部分。本项目示例代码:https://github.com/xiangzhihong/weixinAudio 主要用到4个核心类: 自定义录音按钮(R…

Android 仿微信实现语音聊天功能

在此感谢鸿洋大神,因为我这是在慕课上看大神的视频做出来的。 代码中我已经添加了很多很多注释,不光是为了大家,也是为了自己能够更加透彻的理解该功能 支持原创,也不算原创了哈哈~ http://blog.csdn.net/lhk147852369/article/…

【Unity人物动画】SALSA With RandomEyes (语音生成嘴型/人物说话) 使用

SALSA使用探索 之前做项目时想实现人物说话的效果,因为我们的语音是AI合成的,有很多片段,如果能根据语音生成嘴部的动画,那将极大便利我们的工作。后面是找到了SALSA的这款插件,并摸索出使用方法。 1 插件介绍 官方网…

仿QQ聊天程序(java)

简易版qq聊天:qq聊天[简易版] (resourcecode.cn) 推荐java最新聊天项目(java仿微信聊天): java 简单仿微信聊天(springboot)_Garry1115的博客-CSDN博客_springboot 模拟微信 转载请标明出处:牟尼的专栏 牟尼的博客_CSDN博客-算法…

LaTeX数学公式输入初级入门

LaTeX最强大的功能就是显示美丽的数学公式,下面我们来看这些公式是怎么实现的。 1、数学公式的前后要加上 $ 或 \( 和 \),比如:$f(x) 3x 7$ 和 \(f(x) 3x 7\) 效果是一样的; 如果用 \[ 和 \],或者使用 $$ 和 $$&a…

《LaTex》LaTex数学公式简介

LaTex数学公式简介 文章目录 一、引用数学公式的方法二、LaTex数学公式的基本代码1. 符号1.1. 常规的数学符号:直接从键盘输入1.2. 任何1.3. 存在1.4. 属于1.5. 小于等于1.6. 大于等于1.7. 约等于1.8. 更多数学符号 2. 希腊字母2.1. 阿尔法2.2. 贝塔2.3. 伽马2.4. 希…

LaTex数学公式简介

LaTex数学公式简介目录 一、引用数学公式的方法二、LaTex数学公式的基本代码1. 符号1.1. 常规的数学符号:直接从键盘输入1.2 标志符1.3 希腊字母1.4 运算符1.4.1 三角函数1.4.2 极限1.4.3 项数和指数1.4.4 积分1.4.5 矩阵 三、补充四、参考文献 一、引用数学公式的方…

常用数学公式,推导记录

1 组合数计算公式 组合公式的推导由排列公式去掉重复的部分得来。 排列是,从n个不相同元素中取出m个排成一列(有序),第一个位置可以有n个选择,第二个位置可以有n-1个选择(已经有1个放在前一个位置&#xff…

CMU 开源数学神器,可快速将数学公式转为精美图表!

公众号关注 “GitHubDaily” 设为 “星标”,每天带你逛 GitHub! 转自机器之心 在有些人眼里,数学公式就是一堆数字和符号,但在另一些人看来,这些数字和符号是可以动的,而且极富美感。为什么会有这种差距&am…

Markdown / KaTex数学公式汇总

目录 【LaTex和KaTex】【软件推荐 Mathpix】一、如何插入公式二、上下标三、常用运算符四、高级运算符五、常用数学符号六、特殊符号6.1 箭头6.2 公式序号 七、括号使用八、矩阵九、集合运算十、希腊字母十一、字符大小 【LaTex和KaTex】 LaTeX是一种基于ΤΕΧ的排版系统&…

Latex数学公式表

1. Latex的两种公式模式 行间(inline)模式:即在正文中插入数学内容。行间公式用$ … $ 独立(display)模式:独立成行,可以有或没有编号。无编号用\ [ … \ ] 2.基本元素 希腊字母 标注 上下标 分数 运算符 求和(\sum)&…