You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置FLAG_ACTIVITY_CLEAR_TASK后,通知启动Activity仍获取旧Intent数据的问题咨询

解决通知点击后获取旧Intent Extra的问题

这是Android开发里很常见的一个坑,我来帮你理清问题根源和解决办法:

为什么会拿到旧的timestamp?

你遇到的情况主要由两个原因导致:

1. PendingIntent的缓存复用机制

你创建PendingIntent时用了固定的requestCode = 0和flags = 0:

val notificationIntent: PendingIntent = PendingIntent.getActivity(context, 0, tapIntent, 0)

Android系统会缓存PendingIntent,只要两个PendingIntent的requestCode相同,且对应的Intent核心属性(action、data、category等)一致,系统就会直接复用之前的实例——哪怕你后来更新了Intent里的extra数据。这就导致新通知的PendingIntent依然带着旧的timestamp。

2. Activity启动时的Intent传递逻辑

虽然你设置了FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK,但如果你的Activity只是被滑出后台(没有被系统真正销毁),系统可能不会重新创建Activity实例,而是调用onNewIntent()传递新Intent,但默认情况下getIntent()返回的还是最初的旧Intent,所以你读取到的还是旧数据。

具体解决方案

方案一:让PendingIntent每次都使用最新的Extra

修改PendingIntent.getActivity()的参数,解决复用问题:

val notificationIntent: PendingIntent = PendingIntent.getActivity(
    context,
    id, // 用你生成的唯一id作为requestCode,避免复用
    tapIntent,
    // Android 12+必须添加FLAG_IMMUTABLE,FLAG_UPDATE_CURRENT确保更新现有PendingIntent的Extra
    PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
  • FLAG_UPDATE_CURRENT:如果对应的PendingIntent已存在,会用新Intent的Extra更新它,保证数据是最新的。
  • 用唯一的id作为requestCode:彻底避免系统复用不同通知的PendingIntent。

方案二:在Activity中处理新Intent

在TaskActivity里重写onNewIntent()方法,更新Intent引用并重新处理数据:

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    // 将当前Activity的Intent替换为新传递过来的Intent
    setIntent(intent)
    // 在这里重新读取并处理最新的timestamp
    intent?.let {
        val timestamp = it.getLongExtra("timestamp", System.currentTimeMillis())
        val hourFormatter = SimpleDateFormat("dd/MM/yyyy HH:mm", Locale.getDefault())
        Toast.makeText(this, hourFormatter.format(Date(timestamp)), LENGTH_LONG).show()
    }
}

这一步是双重保险,确保无论系统是创建新Activity实例还是复用旧实例,你都能拿到最新的Intent数据。

额外提示

如果你不想修改requestCode,也可以给每个Intent设置唯一的action来避免复用:

val tapIntent = Intent(context, TaskActivity::class.java).apply {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
    action = "com.task.NEW_TASK_ACTION_$id" // 唯一action,确保Intent不重复
}

内容的提问来源于stack exchange,提问作者V. Govorov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 09:49:09