Android中点击通知后详情页面数据不更新问题排查
问题出在PendingIntent的复用机制上。你每次创建PendingIntent时使用了固定的requestCode(0)和默认flag(0),系统会缓存这个PendingIntent实例,后续即使更新了Intent中的Extra数据,系统也会直接复用旧的PendingIntent,导致SecondActivity始终拿到第一次的Extra内容。
修复步骤:
更新PendingIntent的创建Flag
使用PendingIntent.FLAG_UPDATE_CURRENT强制系统用新的Intent数据更新已有的PendingIntent。针对Android 12(API 31)及以上版本,还需要配合PendingIntent.FLAG_IMMUTABLE(Android 12对PendingIntent的flag有强制要求)。确认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
相关产品推荐
相关产品推荐

