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

如何获取通知中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:06:03