如何获取通知中chronometer的基准值并传递至MainActivity
问题修复方案
你遇到的传值始终为0的问题由三个核心错误导致,按以下步骤修改即可解决:
1. 给通知点击的ContentIntent补充参数
你当前仅给暂停按钮的PendingIntent传入了携带数值的Bundle,点击通知本体触发的ContentIntent使用的是未携带参数的intentTimer,所以拿到的默认值为0。
2. 修正PendingIntent的Flag适配高版本Android
Android 12(API 31)及以上系统要求PendingIntent必须明确指定可变性,如果你需要传递自定义Extra参数,必须使用PendingIntent.FLAG_MUTABLE,否则系统会自动丢弃Intent携带的所有Extra,这是你拿到0的核心原因。
3. 正确传递Chronometer的当前计时值
Chronometer的base属性是计时启动时的基准时间戳,不是已经走过的计时数值,如果你需要获取当前已计时的时长,需要用SystemClock.elapsedRealtime() - it.base计算后再传递。
修改后的代码示例
showNotification方法修改部分
fun showNotification(context: Context, elapsedTime: Long, baseTime: Long, state: Int) { val isPaused = state == Constant.MusicState.PAUSED val intentTimer = Intent(context, MainActivity::class.java).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) // 直接把需要的参数塞入Intent,不需要单独建Bundle intentTimer.putExtra(Constant.Key.CURRENT_TIME, elapsedTime) intentTimer.putExtra(Constant.Key.CHRONOMETER_BASE, baseTime) // 适配高版本的Flag,需要传Extra必须用FLAG_MUTABLE val flag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE } else { PendingIntent.FLAG_UPDATE_CURRENT } // 暂停按钮的PendingIntent val pendingIntentButtonPause = PendingIntent.getActivity(context, 100, intentTimer, flag) val remoteViews = RemoteViews(context.packageName, R.layout.item_notification) remoteViews.setChronometer(R.id.chronometer, baseTime, null, !isPaused) remoteViews.setOnClickPendingIntent(R.id.buttonPause, pendingIntentButtonPause) val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val builder = NotificationCompat.Builder(context, "199102") .setSmallIcon(R.drawable.ic_launcher_background) .setContentText("Test") .setAutoCancel(false) .setOngoing(true) .setOnlyAlertOnce(true) .setUsesChronometer(true) // 给ContentIntent也用带参数的配置 .setContentIntent(PendingIntent.getActivity(context, 10, intentTimer, flag)) builder.setCustomContentView(remoteViews) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { checkNotificationChannel(context, "199102") } notificationManager.notify(199102, builder.build()) }
调用方法修改部分
this.binding.apply { this@MainActivity.musicState = Constant.MusicState.IDLE this.chronometer.setOnChronometerTickListener { try { if (it.text == "00.10" || it.text == "00:10") { // 计算当前已计时的时长 val elapsedTime = SystemClock.elapsedRealtime() - it.base Chronotification.showNotification(this@MainActivity, elapsedTime, it.base, this@MainActivity.musicState) this@MainActivity.musicState = Constant.MusicState.IDLE this@MainActivity.binding.buttonStart.text = "Start" it.text = "00.00" it.stop() } }catch (e : Exception) { e.printStackTrace() } } GeneralHelper.makeClickable(this@MainActivity, this.buttonStart) }
MainActivity接收参数示例
在onCreate或者onNewIntent中接收:
override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) intent?.let { val currentTime = it.getLongExtra(Constant.Key.CURRENT_TIME, 0L) // 这里拿到的currentTime就是正确的计时数值了 } }
内容的提问来源于stack exchange,提问作者Muhammad Faisal Ramadhani
相关产品推荐
相关产品推荐

