Notification

我们在用手机的时候,如果来了短信,而我们没有点击查看的话,是不是在手机的最上边的状态栏里有一个短信的小图标提示啊?你是不是也想实现这种功能呢?今天的Notification就是解决这个问题的。

点击按钮时候,状态栏会显示:

看到了吧,状态栏多出来一个excel图标,当我按住图标不放,往下拖动的时候,出来了这个页面

然后,当我们点击这个对话框之后,就会触发intent,跳转到Notification2Activity.java这个activity。

----------------------------------------------------------------------------------------

注意,NotificationManager里的notify(id,notification)中的id是用来唯一标识我们当前的这个notification的标识符,我们通过cancel方法删除通知时,传递的就是这个值。可能读者在看很多文档的时候,发现这个地方指定了一个莫名奇妙的值,例如R.drawable.icon,很多朋友就纳闷了,为什么这里要指定一个图片呢。这里笔者就介绍下,为什么呢?

 答案其实很简单,我们都知道,我们这里对参数的唯一要求就是,这个id要和notify方法中的一致,并且是唯一;只要满足了这两项,其他的都无所谓。notify和cancel里一致我们作为开发者,太好控制了,但是唯一呢,我们还真不好说,于是这里就有些人动小脑筋了,很巧妙的用了我们系统中的图片资源或者其他资源的索引ID,我们都知道,这些值肯定都是唯一的!

------------------------------------------------------------------------------------------

下面是从网上找的一些资料:

  如果要添加一个Notification,可以按照以下几个步骤

1:获取NotificationManager:

NotificationManager m_NotificationManager=(NotificationManager)this.getSystemService(NOTIFICATION_SERVICE);

2:定义一个Notification:

  Notification  m_Notification=new Notification();

3:设置Notification的各种属性:

 //设置通知在状态栏显示的图标
m_Notification.icon=R.drawable.icon;
               
 //当我们点击通知时显示的内容
m_Notification.tickerText="Button1 通知内容.....";
                               
通知时发出的默认声音
m_Notification.defaults=Notification.DEFAULT_SOUND;

//设置通知显示的参数

Intent   m_Intent=new Intent(NotificationDemo.this,DesActivity.class);      
PendingIntent m_PendingIntent=PendingIntent.getActivity(NotificationDemo.this, 0, m_Intent, 0);

m_Notification.setLatestEventInfo(NotificationDemo.this, "Button1", "Button1通知",m_PendingIntent );

//这个可以理解为开始执行这个通知
m_NotificationManager.notify(0,m_Notification);

4:既然可以增加同样我们也可以删除。当然是只是删除你自己增加的。

  m_NotificationManager.cancel(0);   

  这里的0是一个ID号码,和notify第一个参数0一样。

这也就完成了,添加删除工作。

------------------------------------------------------------------------------------------------------

NoticificationManager很容易可以放在状态栏,也很容易实现从statusbar进入程序 中,
NoticificationManager中通过intent执行此程序的activity就可以了

NoticificationManager状态栏操作

NotificationManager(通知管理器):
NotificationManager负责通知用户事件的发生.
NotificationManager有三个公共方法:
1. cancel(int id) 取消以前显示的一个通知.假如是一个短暂的通知,试图将隐藏,假如是一个持久的通知,将从状态条中移走.
2. cancelAll() 取消以前显示的所有通知.
3. notify(int id,  Notification notification) 把通知持久的发送到状态条上.


//初始化NotificationManager:
NotificationManager nm =
      (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

Notification代表着一个通知.
Notification的属性:
audioStreamType 当声音响起时,所用的音频流的类型
contentIntent 当通知条目被点击,就执行这个被设置的Intent.
contentView 当通知被显示在状态条上的时候,同时这个被设置的视图被显示.
defaults 指定哪个值要被设置成默认的.
deleteIntent 当用户点击"Clear All Notifications"按钮区删除所有的通知的时候,这个被设置的Intent被执行.
icon 状态条所用的图片.
iconLevel 假如状态条的图片有几个级别,就设置这里.
ledARGB LED灯的颜色.
ledOffMS LED关闭时的闪光时间(以毫秒计算)
ledOnMS LED开始时的闪光时间(以毫秒计算)
number 这个通知代表事件的号码
sound 通知的声音
tickerText 通知被显示在状态条时,所显示的信息
vibrate 振动模式.
when 通知的时间戳.

将Notification发送到状态条上:
Notification notification = new Notification();
Notification的设置过程……..
nm.notify(0, notification);   //发送到状态条上

------------------------------------------------------------------------------------------------------------

Notification提供了丰富的手机提示方式:

a)在状态栏(Status Bar)显示的通知文本提示,如:

notification.tickerText = "hello";

b)发出提示音,如:

notification.defaults = Notification.DEFAULT_SOUND;

notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3");

notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");

c)手机振动,如:

notification.defaults = Notification.DEFAULT_VIBRATE;

long[] vibrate = {0,100,200,300};

notification.vibrate = vibrate;

d)LED灯闪烁,如:

notification.defaults = Notification.DEFAULT_LIGHTS;

notification.ledARGB = 0xff00ff00;

notification.ledOnMS = 300;

notification.ledOffMS = 1000;

notification.flags = Notification.FLAG_SHOW_LIGHTS;

4)发送通知:

private static final int ID_NOTIFICATION = 1;

mNotificationManager.notify(ID_NOTIFICATION, notification);

<think> 嗯,用户这次明确想了解IT领域中"notification"的相关信息,结合之前的引用资料和系统指令要求,需要构建一个全面但结构清晰的回答。用户提到的引用1正好涉及通知的并发处理案例,引用2提到领域事件和应用事件的分层概念,这些都可以自然融入回答。 用户身份推测可能是开发者或系统设计人员,因为ta关注的是技术实现层面而非普通用户视角的功能介绍。深层需求可能包括:如何避免通知重复处理(引用1的并发问题)、如何设计通知系统架构(引用2的事件分层)、以及实际落地时的技术选型。 从专业角度,应该覆盖四个维度:基础概念(定义/分类)、核心技术(推送机制/存储设计)、典型问题(并发/去重/延迟)、应用场景(微服务/前端)。特别要注意引用1中的并发标记问题,这需要展开说明锁机制或乐观锁解决方案;引用2的事件分层则可以关联到通知系统的领域驱动设计。 技术细节上需要强调:1. WebSocket和长轮询的对比要给出适用场景;2. 存储设计必须区分SQL/NoSQL的方案差异;3. 分布式场景下的ID生成策略(如雪花算法)。对于移动端通知的特殊性(APNs/FCM)要单独说明,这是开发者常踩的坑。 最后生成的问题要有递进性:从实现原理(问题1)到具体技术(问题2),再到架构设计(问题3),最后是实践难点(问题4),这样能引导用户深入探索。特别注意所有示例代码和公式必须严格遵循系统指令的LaTeX规范,比如事件模型要写成$E_{domain}$格式。 </think> 在IT领域中,**通知(Notification)** 是系统间或应用与用户之间传递信息的关键机制,其设计和实现涉及分布式系统、架构设计、用户体验等多方面。以下是核心要点: ### 一、基础概念与分类 1. **定义** 通知指系统主动触发的信息推送,用于状态变更提醒(如消息已读)、事件响应(如支付成功)或预警(如服务器宕机)。 2. **分类** - **用户级通知**:面向终端用户(App推送、邮件、短信) - **系统级通知**:服务间通信(微服务事件、任务队列消息) - **领域事件**:业务状态变更触发的内部事件(如订单支付完成)[^2] --- ### 二、核心技术实现 #### 1. **推送机制** - **WebSocket**:实时双向通信(聊天消息推送) - **长轮询(Long Polling)**:兼容性更强的准实时方案 - **服务端推送(SSE)**:单向数据流(股票价格更新) ```mermaid graph LR A[事件源] --> B[消息队列] B --> C{推送网关} C --> D[WebSocket] C --> E[APNS/FCM] C --> F[短信/邮件服务] ``` #### 2. **并发控制(引用[1]案例解析)** 当多个请求同时标记通知为已读时: ```python # 伪代码:使用数据库乐观锁避免并发冲突 def mark_as_read(notification_id): notification = Notification.query.get(notification_id) if notification.status == "unread": notification.update(status="read", version=notification.version+1) # 检查版本号是否匹配,防止覆盖 db.session.commit() ``` **关键点**:通过版本号(Versioning)或分布式锁(如Redis锁)保证操作的原子性。 #### 3. **存储设计** | 存储类型 | 适用场景 | 示例 | |----------------|---------------------------|--------------------| | SQL数据库 | 结构化通知(用户消息) | MySQL分区表存储 | | NoSQL | 高吞吐量推送日志 | MongoDB分片集群 | | 时序数据库 | 监控告警通知 | InfluxDB | --- ### 三、典型挑战与解决方案 1. **去重与顺序保证** - 为通知分配全局唯一ID(如雪花算法) - 消息队列使用分区键(Kafka Partition Key)保序 2. **跨平台适配** ```mermaid graph TB Backend -->|统一API| Gateway[iOS/Android/Web网关] Gateway --> APNS[Apple Push Service] Gateway --> FCM[Firebase Cloud Messaging] Gateway --> Webhook[第三方Webhook] ``` 3. **领域事件驱动(引用[2]概念)** 在DDD架构中: - **领域事件**:`OrderPaidEvent`(领域层内部流转) - **应用事件**:`PushNotificationEvent`(由网关层发送给外部系统) --- ### 四、应用场景 1. **微服务通信** 服务A完成支付 → 发布`PaymentCompletedEvent` → 通知服务B发货 $$ \text{Service A} \xrightarrow{\text{RabbitMQ}} \text{Service B} $$ 2. **用户交互系统** - 社交应用:评论实时提醒 - 运维监控:服务器异常告警推送 - 电商系统:订单状态变更短信 3. **前端实时更新** 结合React/Vue的响应式框架,通过WebSocket实现界面无刷新更新。 --- ### 五、移动端特殊考量 1. **系统级推送通道** - iOS:APNs(Apple Push Notification service) - Android:FCM(Firebase Cloud Messaging) 2. **省电策略** 批量合并通知(Doze模式适配)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值