Android通知(Notification)全面解析:从基础到高级应用

一、Android通知概述

通知(Notification)是Android系统中用于在应用之外向用户传递信息的重要机制。当应用需要告知用户某些事件或信息时,可以通过通知在状态栏显示图标,用户下拉通知栏即可查看详细信息。这种机制几乎被所有现代应用采用,用于推送新闻、消息、广告等内容3。

与Toast相比,Notification的优势在于:

  • 可以长时间停留在通知栏,适合内容较多且需要持久展示的信息

  • 支持丰富的交互方式,如点击跳转、按钮操作等

  • 可以显示在锁屏界面(需用户授权)

  • 支持多种提醒方式(声音、震动、LED灯等)

二、通知的核心组件

Android通知系统主要涉及以下几个关键类17:

  1. Notification:表示通知信息的类,包含通知的所有属性

  2. NotificationManager:通知管理类,负责发送、更新和取消通知

  3. Notification.Builder/NotificationCompat.Builder:用于构建Notification对象的构建器类

其中,NotificationCompat.Builder是支持库中的兼容版本,可以确保在较旧版本的Android系统上也能正常工作5。

三、创建和发送通知的基本流程

3.1 获取NotificationManager实例

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

3.2 使用Builder构建通知


NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID).setSmallIcon(R.drawable.notification_icon)  // 必须设置的小图标.setContentTitle("通知标题")                 // 必须设置的标题.setContentText("通知内容详情")              // 必须设置的内容.setPriority(NotificationCompat.PRIORITY_DEFAULT);

3.3 设置通知点击行为

通常需要为通知设置点击后跳转的Activity:


Intent intent = new Intent(this, TargetActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE);builder.setContentIntent(pendingIntent);

3.4 发送通知

notificationManager.notify(notificationId, builder.build());

其中notificationId是通知的唯一标识符,可用于后续更新或取消通知3。

四、通知的丰富功能

4.1 通知样式

Android支持多种通知样式扩展:

  1. 大文本样式:显示更多文本内容

    NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle().bigText("这里是更长的通知内容文本...");
    builder.setStyle(bigTextStyle);

  2. 大图片样式:显示大图预览

    NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(), R.drawable.big_image));
    builder.setStyle(bigPictureStyle);

  3. 收件箱样式:适合显示多条简短信息

    
    NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle().addLine("消息1").addLine("消息2").addLine("消息3");
    builder.setStyle(inboxStyle);

4.2 通知优先级和提醒方式

可以通过以下方法设置通知的提醒方式1:


// 设置默认提醒(声音、震动、LED灯)
builder.setDefaults(NotificationCompat.DEFAULT_ALL);// 或单独设置
builder.setSound(Uri.parse("file:///sdcard/notification_sound.mp3")).setVibrate(new long[]{0, 300, 500, 700}) // 延迟0ms,震动300ms,延迟500ms,震动700ms.setLights(Color.RED, 1000, 1000); // LED灯颜色,亮持续时间,灭的持续时间

4.3 进度条通知

对于下载、上传等需要显示进度的场景:


// 确定进度
builder.setProgress(100, progress, false);// 不确定进度(持续活动)
builder.setProgress(0, 0, true);// 完成后更新通知移除进度条
builder.setContentText("下载完成").setProgress(0, 0, false);
notificationManager.notify(notificationId, builder.build());

4.4 常驻通知(Ongoing Notification)

某些需要持续显示的通知(如音乐播放)可以设置为常驻通知,用户无法手动清除:

builder.setOngoing(true);

五、通知渠道(Notification Channels)

Android 8.0(API 26)引入了通知渠道的概念,允许用户按渠道管理应用通知。创建通知前需要先创建渠道:


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {CharSequence name = "我的渠道";String description = "渠道描述";int importance = NotificationManager.IMPORTANCE_DEFAULT;NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);channel.setDescription(description);NotificationManager notificationManager = getSystemService(NotificationManager.class);notificationManager.createNotificationChannel(channel);
}

六、锁屏通知

Android 5.0及以上支持在锁屏显示通知,但出于隐私考虑,可以设置不同的显示方式24:

  1. 显示所有通知内容

  2. 隐藏敏感信息(仅显示通知存在,不显示具体内容)

  3. 完全不显示通知

用户可以在系统设置中配置这些选项,开发者也可以通过setVisibility()方法建议通知的显示方式:

builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC); // 或VISIBILITY_PRIVATE, VISIBILITY_SECRET

Android 16还将引入"紧凑型"锁屏通知布局,将通知折叠成简洁列表,提升锁屏界面的整洁度48。

七、通知点击响应

点击通知后的响应行为主要通过PendingIntent实现。根据需求不同,可以有以下几种处理方式9:

7.1 简单跳转

直接跳转到目标Activity,按返回键退出应用:

Intent intent = new Intent(this, TargetActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE);
builder.setContentIntent(contentIntent);

7.2 保持Activity栈

点击通知后进入目标Activity,按返回键返回上级Activity:

Intent[] intents = new Intent[2];
intents[0] = Intent.makeRestartActivityTask(new ComponentName(this, MainActivity.class));
intents[1] = new Intent(this, TargetActivity.class);PendingIntent contentIntent = PendingIntent.getActivities(this, 0, intents, PendingIntent.FLAG_IMMUTABLE);
builder.setContentIntent(contentIntent);

八、通知管理

8.1 更新通知

使用相同的notificationId可以更新已有通知:

builder.setContentText("更新后的内容");
notificationManager.notify(notificationId, builder.build());

8.2 取消通知

// 取消单个通知
notificationManager.cancel(notificationId);// 取消所有通知
notificationManager.cancelAll();

8.3 智能通知管理

Android 16将引入"通知冷却"功能,当短时间内收到大量通知时,系统会自动降低后续通知的音量和提醒强度,减少对用户的干扰6。

九、最佳实践

  1. 必设内容:小图标、标题和内容是必须设置的,否则会抛出异常7

  2. 及时更新:对于进度通知,完成后应及时更新移除进度条

  3. 合理使用优先级:不要滥用高优先级通知

  4. 尊重用户选择:如果用户关闭了某个通知渠道,不要再尝试通过其他方式发送

  5. 考虑兼容性:使用NotificationCompat保证在老版本上的兼容性

十、总结

Android通知系统提供了丰富而强大的功能,从简单的文本提示到复杂的交互式通知,能够满足各种应用场景的需求。随着Android系统的迭代更新,通知功能也在不断进化,如Android 16将推出的紧凑型锁屏通知和通知冷却功能46。作为开发者,我们应当充分利用这些功能,同时遵循设计指南和最佳实践,为用户提供既美观又实用的通知体验。

通过合理使用通知,应用可以有效地与用户保持沟通,提升用户参与度和满意度,但也要注意不要过度打扰用户,找到功能性与用户体验的平衡点。

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

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

相关文章

VUE3(四)、组件通信

1、props作用&#xff1a;子组件之间的通信。父传子&#xff1a;属性值的非函数。子传父&#xff1a;属性值是函数。父组件&#xff1a;<template><div>{{ childeData }}</div>——————————————————————————————<child :pare…

【数据结构与算法】数据结构初阶:详解二叉树(六)——二叉树应用:二叉树选择题

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题 &#x1f349;学习方向&#xff1a;C/C方向 ⭐️人生格言&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为…

Android广播实验

【实验目的】了解使用Intent进行组件通信的原理&#xff1b;了解Intent过滤器的原理和匹配机制&#xff1b;掌握发送和接收广播的方法【实验内容】任务1、普通广播&#xff1b;任务2、系统广播&#xff1b;任务3、有序广播&#xff1b;【实验要求】1、练习使用静态方法和动态方…

html转word下载

一、插件使用//转html为wordnpm i html-docx-js //保存文件到本地npm i file-saver 注&#xff1a;vite 项目使用esm模式会报错&#xff0c;with方法错误&#xff0c;修改如下&#xff1a;//直接安装修复版本npm i html-docx-fixed二、封装导出 exportWord.jsimport htmlDocx f…

北方公司面试记录

避免被开盒&#xff0c;先称之为“北方公司”&#xff0c;有确定结果后再更名。 先说流程&#xff0c;线下面试&#xff0c;时间非常急&#xff0c;下午两点钟面试&#xff0c;中午十二点打电话让我去&#xff0c;带两份纸质简历。 和一般的菌工单位一样&#xff0c;先在传达室…

linux——ps命令

PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND0 1 1 1 ? -1 Ss 0 0:01 /usr/lib/systemd/systemd1 123 123 123 ? -1 S 0 0:00 /usr/sbin/sshd -D123 456 456 456 pts/0 456 R 10…

C#.NET 依赖注入详解

一、是什么 在 C#.NET 中&#xff0c;依赖注入&#xff08;Dependency Injection&#xff0c;简称 DI&#xff09; 是一种设计模式&#xff0c;用于实现控制反转&#xff08;Inversion of Control&#xff0c;IoC&#xff09;&#xff0c;以降低代码耦合、提高可测试性和可维护…

Vue监视数据的原理和set()的使用

在 Vue 中&#xff0c;Vue.set()&#xff08;或 this.$set()&#xff09;是用于解决响应式数据更新检测的重要方法&#xff0c;其底层与 Vue 的数据监视原理紧密相关。以下从使用场景和实现原理两方面详细说明&#xff1a;一、Vue.set () 的使用场景与用法1. 为什么需要 Vue.se…

在 Vue 中,如何在回调函数中正确使用 this?

在 Vue 组件中&#xff0c;this 指向当前组件实例&#xff0c;但在回调函数&#xff08;如定时器、异步请求、事件监听等&#xff09;中&#xff0c;this 的指向可能会丢失或改变&#xff0c;导致无法正确访问组件的属性和方法。以下是在回调函数中正确使用 this 的几种常见方式…

第4章唯一ID生成器——4.4 基于数据库的自增主键的趋势递增的唯一ID

基于数据库的自增主键也可以生成趋势递增的唯一 ID&#xff0c;且由于唯一ID不与时间戳关联&#xff0c;所以不会受到时钟回拨问题的影响。 4.4.1 分库分表架构 数据库一般都支持设置自增主键的初始值和自增步长&#xff0c;以MySQL为例&#xff0c;自增主键的自增步长由auto_i…

设计模式:Memento 模式详解

Memento 模式详解Memento&#xff08;备忘录&#xff09;模式是一种行为型设计模式&#xff0c;用于在不破坏封装性的前提下&#xff0c;捕获并外部化一个对象的内部状态&#xff0c;以便在之后能够将该对象恢复到原先保存的状态。它广泛应用于需要实现撤销&#xff08;Undo&am…

数据结构(6)单链表算法题(下)

一、环形链表Ⅰ 1、题目描述 https://leetcode.cn/problems/linked-list-cycle 2、算法分析 思路&#xff1a;快慢指针 根据上图所示的流程&#xff0c;我们可以推测出这样一个结论&#xff1a;若链表带环&#xff0c;快慢指针一定会相遇。 那么&#xff0c;这个猜测是否正…

智能制造,从工厂建模,工艺建模,柔性制造,精益制造,生产管控,库存,质量等多方面讲述智能制造的落地方案。

智能制造&#xff0c;从工厂建模&#xff0c;工艺建模&#xff0c;柔性制造&#xff0c;精益制造&#xff0c;生产管控&#xff0c;库存&#xff0c;质量等多方面讲述智能制造的落地方案。

Qt 分裂布局:QSplitter 使用指南

在 GUI 开发中&#xff0c;高效管理窗口空间是提升用户体验的关键。QSplitter 作为 Qt 的核心布局组件&#xff0c;让动态分割窗口变得简单直观。一、QSplitter 核心功能解析 QSplitter 是 Qt 提供的布局管理器&#xff0c;专用于创建可调节的分割区域&#xff1a; 支持水平/垂…

R语言与作物模型(DSSAT模型)技术应用

R语言在DSSAT模型的气候、土壤、管理措施等数据准备&#xff0c;自动化模拟和结果分析上都发挥着重要的作用。一&#xff1a;DSSAT模型的高级应用 1.作物模型的概念 2.DSSAT模型发展现状 3.DSSAT与R语言的安装 4.DSSAT模型的高级应用案例 5.R语言在作物模型参数优化中的应用 6.…

JavaSE:学习输入输出编写简单的程序

一、打印输出到屏幕 Java提供了三种核心输出方法&#xff0c;适合不同场景&#xff1a; System.out.println() 打印内容后 自动换行 System.out.println("Welcome"); System.out.println("to ISS"); // 输出&#xff1a; // Welcome // to ISSSystem.out…

访问者模式感悟

访问者模式 首先有两个东西: 一个是访问者vistor (每一个访问者类都代表了一类操作) 一个是被访问者entity (model /info/pojo/node等等这些都行)也就是是说是一个实体类 其操作方法被抽离给了其他类。 访问者模式的核心思想就是**“把操作从数据结构中分离出来,每种操作…

从零到部署:基于Go和Docker的全栈短链接服务实战(含源码)

摘要&#xff1a;本文将手把手带你使用Go语言&#xff0c;并遵循依赖倒置、分层架构等最佳实践&#xff0c;构建一个高性能、高可用的全栈短链接生成器。项目采用Echo框架、GORM、Redis、MySQL&#xff0c;并通过Docker和Docker Compose实现一键式容器化部署到阿里云服务器。文…

MyBatis_3

上一篇文章&#xff0c;我们学习了使用XML实现MyBatis进行增、删、查、改等操作&#xff0c;本篇文章&#xff0c;我们将学习#{ }和${ }获取方法参数的区别和使用MyBatisXML实现动态SQL语句。 #{ }和${ }的区别 在之前的文章中我们都是使用#{ }进行赋值&#xff0c;但实际上M…

智能图书馆管理系统开发实战系列(一):项目架构设计与技术选型

项目背景 智能图书馆管理系统&#xff08;ILMS&#xff09;是一个现代化的桌面应用程序&#xff0c;采用前后端分离架构&#xff0c;结合了Web技术的灵活性和桌面应用的用户体验。本项目从高保真原型设计开始&#xff0c;经过完整的软件开发生命周期&#xff0c;最终实现为一个…