You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动