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

Android中点击通知后详情页面数据不更新问题排查

问题出在PendingIntent的复用机制上。你每次创建PendingIntent时使用了固定的requestCode(0)和默认flag(0),系统会缓存这个PendingIntent实例,后续即使更新了Intent中的Extra数据,系统也会直接复用旧的PendingIntent,导致SecondActivity始终拿到第一次的Extra内容。

修复步骤:

  1. 更新PendingIntent的创建Flag
    使用PendingIntent.FLAG_UPDATE_CURRENT强制系统用新的Intent数据更新已有的PendingIntent。针对Android 12(API 31)及以上版本,还需要配合PendingIntent.FLAG_IMMUTABLE(Android 12对PendingIntent的flag有强制要求)。

  2. 确认Question类实现Serializable接口
    确保Question类已经实现Serializable接口,否则跨进程传递数据会失败。


修改后的AlarmReceiver代码:

class AlarmReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        val dbHelper = context?.let { DbHelper(it) }
        val question = dbHelper?.getQuestion((0..1280).random()) ?: return

        val i = Intent(context, SecondActivity::class.java)
        i.putExtra("LAW", question)
        i.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK

        // 关键:设置正确的PendingIntent Flag
        val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
        } else {
            PendingIntent.FLAG_UPDATE_CURRENT
        }
        val pendingIntent = PendingIntent.getActivity(context, 0, i, flags)

        val builder = NotificationCompat.Builder(context!!, "foxandroid")
            .setSmallIcon(R.drawable.ic_launcher_background)
            .setContentTitle("${question.type}  ${question.code}  ${question.subcode}  ${question.shortDesc}")
            .setContentText(question.fullDesc)
            .setAutoCancel(true)
            .setDefaults(NotificationCompat.DEFAULT_ALL)
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setContentIntent(pendingIntent)

        val notificationManager = NotificationManagerCompat.from(context)
        notificationManager.notify(123, builder.build())
    }
}

优化SecondActivity(可选)

如果后续移除FLAG_ACTIVITY_CLEAR_TASK flag,SecondActivity可能会复用已有实例,此时需要重写onNewIntent方法处理新的Intent数据:

class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
        updateUI(intent)
    }

    // 当Activity被复用,新Intent到来时调用
    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        setIntent(intent)
        updateUI(intent)
    }

    private fun updateUI(intent: Intent?) {
        val law = if (Build.VERSION.SDK_INT >= 33) {
            intent?.getSerializableExtra("LAW", Question::class.java)
        } else {
            intent?.getSerializableExtra("LAW") as? Question
        } ?: return

        Log.e("law:", law.shortDesc)
        textTitle.text = "${law.type}  ${law.code}  ${law.subcode}  ${law.shortDesc}"
        textContent.text = law.fullDesc

        button.setOnClickListener {
            val webIntent = Intent(this, WebActivity::class.java)
            webIntent.putExtra("LAW", "${law.type}  ${law.code}  ${law.subcode}")
            startActivity(webIntent)
        }
    }
}

内容的提问来源于stack exchange,提问作者Man Steel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:05:24