文档章节

Android N在通知栏上实现直接回复消息

shenhuniurou
 shenhuniurou
发布于 2017/07/05 22:54
字数 947
阅读 82
收藏 1
点赞 0
评论 0

Android N 版本中的通知又做了进一步的改进。主要改进了如下几点:

  • 新的 UI 效果
  • 增强对自定义 View 的支持
  • 支持通知内直接回复
  • 新的 MessagingStyle 样式通知
  • 聚合通知 同一类型通知可以聚合一起了,再也不用担心用户手机满屏都是通知了

刚好,我司的app是一款社交类型的app,为了适配Android N的这些特性,于是花了点时间给自己的app加上了通知栏直接回复的功能。直接上代码:

public static void sendNotification(Context context, String tickerText, String title, String content, Intent intent, String user, int notifyId) {

    // 初始化NotificationManager
    NotificationManager messageNotificatioManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    
    // 创建通知
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    builder.setTicker(content);
    builder.setContentInfo(tickerText);
    builder.setContentText(content);
    builder.setContentTitle(title);
    builder.setSmallIcon(R.drawable.icon_push);
    builder.setAutoCancel(true);

    // 设置通知的优先级(悬浮通知)
    builder.setPriority(NotificationCompat.PRIORITY_MAX);
    
    // 根据用户的偏好设置通知是否有声音和震动
    boolean hasVoice = AppDataCache.getInstance().getIsVoice();
    boolean hasVibrate = AppDataCache.getInstance().getIsShake();
    if (hasVoice) {
        // 使用系统通知声音
        Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        // 设置通知的提示音
        builder.setSound(alarmSound);
    }
    if (hasVibrate) {
        long [] pattern = { 70, 150, 70, 150 };
        // 设置通知的震动
        builder.setVibrate(pattern);
    }

    builder.setWhen(System.currentTimeMillis());
    pendIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    builder.setContentIntent(pendIntent);
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        adaptAndroidN(context, builder, user);
    }

    messageNotification = builder.build();
    messageNotification.flags = Notification.FLAG_AUTO_CANCEL;
    messageNotificatioManager.notify(notifyId, messageNotification);
}

另外像微信QQ,用户在设置通知是否有声音时,点击选中时会播放一遍系统通知声音,具体做法是这样的:

// 播放系统通知铃声
public static void palySound(Context context) {
    Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    MediaPlayer mMediaPlayer = MediaPlayer.create(context, soundUri);
    mMediaPlayer.setLooping(false);
    mMediaPlayer.start();
}

其中RingtoneManager.TYPE_NOTIFICATION的值有如下几种:

public static final int TYPE_RINGTONE = 1;
public static final int TYPE_NOTIFICATION = 2;
public static final int TYPE_ALARM = 4;
public static final int TYPE_ALL = TYPE_RINGTONE | TYPE_NOTIFICATION | TYPE_ALARM;

也就是通知声音、铃声声音、闹钟声音和这三种的组合。

在Android N上通知要显示时间,必须要设置下面这句才可以

builder.setShowWhen(true);

上面发送通知的方法中,直接在通知栏中回复的关键代码就是

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    adaptAndroidN(context, builder, user);
}
private static void adaptAndroidN(Context context, NotificationCompat.Builder builder, String user) {
    builder.setShowWhen(true);
    String replyLabel = "回复";
    RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
        .setLabel(replyLabel)
        .build();
    Intent intent = new Intent(context, ReplyService.class);
    intent.putExtra("userId", user);
    PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    NotificationCompat.Action action = new NotificationCompat.Action.Builder(R.drawable.icon_push, replyLabel, pendingIntent)
            .addRemoteInput(remoteInput)
            .setAllowGeneratedReplies(true)
            .build();
    builder.addAction(action);
}

这里我只添加了一个回复按钮,是可以添加多个的,看源码发现addAction其实是把这个action添加到一个ArrayList中的,所有肯定是可以显示多个按钮的。

回复输入内容后,点击右边的发送按钮,这个后续动作需要我们通过PendingIntent来实现,比如我这里是要将这条消息发送给对方,所以我使用了IntentService来完成。

public class ReplyService extends IntentService implements SendMessageCallback {

    private static final String KEY_TEXT_REPLY = "key_text_reply";
    private DatabaseHelper helper;
    private SocketMessage tmpMsg;
    private String userId;

    public ReplyService() {
        super("ReplyService");
    }


    @Override protected void onHandleIntent(@Nullable Intent intent) {
        Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
        String message = null;
        if (remoteInput != null) {
            message = remoteInput.getCharSequence(KEY_TEXT_REPLY).toString();
        }

        //TODO:发送消息message
    }

}

关键点就是在onHandleIntent方法中通过RemoteInput获取到刚输入的信息:

Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
String message = null;
if (remoteInput != null) {
    message = remoteInput.getCharSequence(KEY_TEXT_REPLY).toString();
}

执行完一系列操作后,IntentService自动结束,完成。

结尾处关于通知我有一点疑惑,就是在Android5.0之后的系统,像QQ微信是刚下载安装后它就有悬浮锁屏显示通知的权限,而普通的app是没有的,即使我将优先级设置为PRIORITY_MAX还是不行。不知道是不是国内的手机厂商将QQ微信加入白名单了啊?如果让用户手动去设置这招怕是不行,因为并不是每个用户都像Android开发者一样爱去折腾手机。我目前是用Android7.1的原生系统测试的,是默认可以显示悬浮通知的。

参考文章 Android Nougat 的通知改进

© 著作权归作者所有

共有 人打赏支持
shenhuniurou
粉丝 20
博文 78
码字总数 63826
作品 0
广州
Android工程师
Android通知栏微技巧,8.0系统中通知栏的适配

转载请注明出处:https://blog.csdn.net/guolinblog/article/details/79854070 大家好,今天我们继续来学习Android 8.0系统的适配。 之前我们已经讲到了,Android 8.0系统最主要需要进行适配...

sinyu890807 ⋅ 04/17 ⋅ 0

Android P Beta 2 及终版 API 强势来袭!

在四周前的 Google I/O 开发者大会上,我们发布了Android P 的首个 Beta 版,将人工智能 (AI) 定位为操作系统的核心,并侧重于提供智能且简洁的体验。 今天,我们隆重推出 Android P Beta 2...

谷歌开发者 ⋅ 06/07 ⋅ 0

一大波 Android 刘海屏来袭,全网\Maybe/最全适配技巧!

一、序 Hi,大家好,我是承香墨影! Apple 一直在引领设计的潮流,自从 iPhone X 发布之后,"刘海屏" 就一直存在争议。不过不管你怎样,Android 也要跻入 "刘海屏" 的行列,尤其是 Android ...

承香墨影 ⋅ 04/12 ⋅ 0

说说 Android 中的通知(Notification)

当应用程序不在前台运行,这时就可以借助通知( Notification )向用户发送一些提示消息。 发出通知后,手机最上方的状态栏中就会显示一个通知图标,下拉状态栏就会看到通知的详情。 1 基本用...

deniro ⋅ 05/20 ⋅ 0

Android源码剖析之Framework层进阶版(Wms窗口管理)

本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 上一篇我们主要讲了Ams,篇幅有限,本篇再讲讲Wms,即WindowManagerService,管理窗口的服务。主要负责窗口的创建、删除、...

liuzxgeek ⋅ 2016/08/26 ⋅ 0

Android P 版本号为 9,第三个开发者预览版有这些变化

近日,Google 如期放出了 Android P 的第三个开发者预览版(以下简称 DP3)。DP3 主要面向应用开发者,将该版本操作系统的 API 等级正式确定为 API level 28,开发者可以借助相关的 SDK 面向...

h4cd ⋅ 06/10 ⋅ 0

安卓应用安全指南 4.10 使用通知

4.10 使用通知 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 Android 提供用于向最终用户发送消息的通知功能。 使用通知会使一个称为...

apachecn_飞龙 ⋅ 03/24 ⋅ 0

Android N 最令人期待的 10 大新功能

不久,谷歌将正式发布Android N,它有超过250个新功能。安卓粉有福了。很多新功能的目标都是使Android体验更快,更愉快,更富有成效。下面是我们最期待的十大新特性。 01.多窗口模式 在计算机...

oschina ⋅ 2016/05/22 ⋅ 21

Android 定制系统 - MIUI

MIUI是小米科技推出的一款基于CyanogenMod而深度定制的Android移动操作系统,从Android 4.0开始,已经完全脱离CyanogenMod而改为基于原厂ROM的定制方式,中文名称为“米柚”。它大幅修改了A...

匿名 ⋅ 2013/01/10 ⋅ 0

Android 用户界面---通知(Notifications)概要

有几种类型的场景可能会要求你把应用程序中发生的事件通知给用户。有些事件需要用户响应,而有些则不需要。例如: 1. 当像文件保存完成的一个事件发生时,就应该显示一个短消息,提示用户保存...

长平狐 ⋅ 2012/10/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NFS介绍 NFS服务端安装配置 NFS配置选项

NFS介绍 NFS是Network File System的缩写;这个文件系统是基于网路层面,通过网络层面实现数据同步 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导...

lyy549745 ⋅ 33分钟前 ⋅ 0

Spring AOP 源码分析 - 筛选合适的通知器

1.简介 从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析。本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出合适的通知器(Advisor...

java高级架构牛人 ⋅ 56分钟前 ⋅ 0

HTML-标签手册

标签 描述 <!--...--> 定义注释。 <!DOCTYPE> 定义文档类型。 <a> 定义锚。超链接 <abbr> 定义缩写。 <acronym> 定义只取首字母的缩写。 <address> 定义文档作者或拥有者的联系信息。 <apple......

ZHAO_JH ⋅ 57分钟前 ⋅ 0

SylixOS在t_main中使用硬浮点方法

问题描述 在某些使用场景中,应用程序不使用动态加载的方式执行,而是跟随BSP在 t_main 线程中启动,此时应用代码是跟随 BSP 进行编译的。由于 BSP 默认使用软浮点,所以会导致应用代码中的浮...

zhywxyy ⋅ 今天 ⋅ 0

JsBridge原理分析

看了这个Github代码 https://github.com/lzyzsd/JsBridge,想起N年前比较火的Hybrid方案,想看看现在跨平台调用实现有什么新的实现方式。代码看下来之后发现确实有点独特之处,这里先把核心的...

Kingguary ⋅ 今天 ⋅ 0

Intellij IDEA神器常用技巧五-真正常用快捷键(收藏级)

如果你觉得前面几篇博文太啰嗦,下面是博主多年使用Intellij IDEA真正常用快捷键,建议收藏!!! sout,System.out.println()快捷键 fori,for循环快捷键 psvm,main方法快捷键 Alt+Home,导...

Mkeeper ⋅ 今天 ⋅ 0

Java 静态代码分析工具简要分析与使用

本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,...

Oo若离oO ⋅ 今天 ⋅ 0

SpringBoot自动配置小记

spring-boot项目的特色就在于它的自动配置,自动配置就是开箱即用的本源。 不过支持一个子项目的自动配置,往往比较复杂,无论是sping自己的项目,还是第三方的,都是如此。刚接触会有点乱乱...

大_于 ⋅ 今天 ⋅ 0

React jsx 中写更优雅、直观的条件运算符

在这篇文字中我学到了很多知识,同时结合工作中的一些经验也在思考一些东西。比如条件运算符 Conditional Operator condition ? expr_if_true : expr_if_false 在jsx中书写条件语句我们经常都...

开源中国最帅没有之一 ⋅ 今天 ⋅ 0

vim编辑模式与命令模式

5.5 进入编辑模式 从编辑模式返回一般模式“Esc” 5.6 vim命令模式 命令 :“nohl”=no high light 无高亮,取消内容中高亮标记 "x":保存退出,和wq的区别是,当进入一个文件未进行编辑时,使...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部