Android推送通知:如何显示发送时间而非接收时间?
Android实现通知显示实际发送时间的方案
当然可以实现!Android系统完全支持让通知显示消息的实际发送时间,而不是设备接收/开机的时间,和iOS的效果一致。核心在于构建通知时正确配置时间戳,下面是具体的实现步骤和注意事项:
1. 核心操作:设置通知的发送时间戳
Android的NotificationCompat.Builder提供了专门的API来指定通知的实际发生时间,只需要两个关键操作:
- 调用
setWhen(long timestamp):传入消息实际发送时间的毫秒级时间戳(比如从服务器获取的消息发送时间,转成UTC毫秒值)。 - 调用
setShowWhen(true):显式开启时间显示(部分系统默认开启,但显式设置更稳妥)。
示例代码如下:
// 假设从推送payload中解析出消息的实际发送时间戳(毫秒) val actualSentTime = 1718000000000L val notification = NotificationCompat.Builder(context, CHANNEL_ID) .setContentTitle("新消息") .setContentText("你有一条未读消息") .setSmallIcon(R.drawable.ic_notification) .setWhen(actualSentTime) // 设置实际发送时间 .setShowWhen(true) // 确保时间显示 .build()
2. 处理关机后推送的场景
当设备关机时,推送服务(比如FCM、极光推送等)会暂存未送达的通知,开机后再推送给设备。这时候需要:
- 在推送的payload中携带消息原始发送时间戳(比如在FCM的
data字段中加入"sent_time": "1718000000000")。 - 客户端收到推送后,优先使用payload中的原始时间戳来设置
setWhen,而不是用当前设备时间。
这样即使开机后才收到通知,系统也会基于你设置的原始时间戳显示正确的发送时间,而不是开机后的当前时间。
3. 适配不同系统和Launcher
大部分主流Android Launcher(原生系统、小米MIUI、华为EMUI/鸿蒙、三星One UI等)都会尊重setWhen设置的时间戳,显示实际发送时间。少数定制化较强的Launcher可能有特殊样式,但核心逻辑是通用的——只要正确设置了时间戳,系统层面就会识别并展示正确的时间。
4. 关键注意事项
- 时间戳准确性:确保服务器传递的时间戳是UTC标准时间,避免时区差异导致显示错误。
- 第三方推送服务兼容性:确认你使用的推送服务允许在payload中自定义传递时间戳字段,不会篡改或丢失这个信息。
- 版本兼容性:
setWhenAPI从Android 1就存在,setShowWhen从Android 4.1开始支持,几乎覆盖所有在用的Android设备。
其实WhatsApp等主流IM应用就是采用这个方案,你可以实际测试一下:关机期间收到的WhatsApp消息,开机后通知显示的是消息发送的真实时间,而非开机时间。
内容的提问来源于stack exchange,提问作者Doua Beri




