Notification

本文详细介绍如何在Android中创建和使用Notification,包括基本属性设置、进度条更新、返回应用特定界面等高级功能。

一:普通Notification

 

 

 1.内容标题setContentTitle(...)
 2.大图标setLargeIcon(Bitmap)
 3.内容setContentText(...)
 4.内容附加信息setContentInfo(...)
 5.小图标setSmallIcon(...)
 6.时间(自动生成)

二:Notification的创建

1>实例化一个NotificationCompat.Builder对象
2>调用builder的相关方法对notification设置标题,图标,内容等;
3>调用builder.build()方法,此方法返回一个Notification类的对象;
4>实例化一个NotificationManager对象
5>调用manager的notify(...)方法 来发送通知。

三:普通的Notification(点击之后跳到打电话界面,不需要可以不写setContentIntent这个方法)

private NotificationManager notificationManager;
// 获取通知管理器的系统组件实例
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

 

private void showNormal() {
//建造者模式----利用静态内部类来构建宿主类的对象,链式编程
Notification notification = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("ContentTitle")//设置通知标题
.setContentText("ContentText")//设置通知内容
.setTicker("showNormal")//设置滚动字幕
.setContentInfo("contentInfo")//设置附加信息
.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_VIBRATE)//声音|震动通知,设置震动的时候需要设置权限: <uses-permission android:name="android.permission.VIBRATE" />
//DEFAULT_ALL:声音,震动,呼吸灯都有
.setContentIntent(PendingIntent.getActivity(this, 100,//100是requestCode
new Intent(Intent.ACTION_CALL,
Uri.parse("tel:10086")),
PendingIntent.FLAG_ONE_SHOT))//需要添加打电话权限,否则不会报错但无效果(延时意图不能在logCat中查看),如果没设置延时意图, 则点击通知无法自动消除.
.build(); //构建Notification 类对象
//注意:是notification对象的flags,不是Builder对象的
notification.flags |= Notification.FLAG_AUTO_CANCEL; //设置为点击后可清除,否则点击无法清除[必须同时设置了延时意图PendingIntent]
notification.flags |= Notification.FLAG_NO_CLEAR; //设置为不能横向滑动清除,否则横向拖动可清除,等价于builder对象调用.setOngoing(true)
notificationManager.notify(1, notification); //指定id,发送通知
}

四:带进度条的Notification

 private void showProgressBar() {
//final:因为要在内部类里面使用builder .
final NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSmallIcon(R.mipmap.ic_launcher)
.setTicker("showProgressBar").setContentInfo("contentInfo")
.setOngoing(true) //不可拖动清除
.setContentTitle("ContentTitle")
.setContentText("ContentText");
//启动一个线程来更新进度,因为不能阻塞UI线程
new Thread(new Runnable() {//Thread构造方法的实参是一个匿名内部类(实现了Runnable接口)
@Override
public void run() {
for (int progress = 0; progress < 100; progress += 10) {
//第一个参数 最大进度, 第二个参数 当前进度
//第三个参数 无明确进度的进度条样式; true:不确定;false:确定
builder.setProgress(100, progress, false);
notificationManager.notify(2, builder.build());//发送通知
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("sleep failure");
}
}
builder.setContentTitle("下载完成")
.setProgress(0, 0, false).setOngoing(true);//设置为下载完成后可清除
notificationManager.notify(2, builder.build());
}
}).start();
}

五:返回应用的某个界面[了解]

有时候我们可能需要实现这样的功能:当新notification出现时,我们希望点击它后可直接进入应用相应的界面中去完整查看或处理此消息的功能。 然后,当我们点击back按钮时返回到应用主界面而不是桌面。比如:当我们有新的短信来时,我们在任务栏中点击它后进入读信息页面,当我们读完短信后,按“返回”键回到短信的主界面,而不是手机桌面。要实现这样的功能要我们做相应的处理:
private void backToApp() {
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back stack
stackBuilder.addParentStack(OtherActivity.class);
// Adds the Intent to the top of the stack
Intent resultIntent = new Intent(this, OtherActivity.class);//点击通知后会打开OtherActivity,回退后显示MainActivity,再回退后退出app
//并在清单文件中配置OtherActivity依赖的父窗体为MainActivity(详见下面xml配置)
stackBuilder.addNextIntent(resultIntent);
// Gets a PendingIntent containing the entire back stack
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,//int requestCode
PendingIntent.FLAG_UPDATE_CURRENT);//如果系统中有一个和你描述的PendingIntent对等的PendingInent,那么系统将使用该PendingIntent对象,但是会使用新 的Intent来更新之前PendingIntent中的Intent对象数据,例如更新Intent中的Extras。

Notification notification = new NotificationCompat.Builder(this)
.setLargeIcon(icon).setSmallIcon(R.drawable.ic_launcher)
.setTicker("backApp").setContentInfo("contentInfo")
.setContentTitle("ContentTitle").setContentText("ContentText")
.setContentIntent(resultPendingIntent).setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL).build();
manager.notify(5, notification);
this.finish();//关闭当前Activity
}

并需要我们在配置文件中对我们用来显示详细信息的OtherActivity进行相应的配置如下:

<activity
android:name=".OtherActivity"
android:label="第二个页面"
android:parentActivityName=".MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>

转载于:https://www.cnblogs.com/niupi/p/5519709.html

<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、付费专栏及课程。

余额充值