0

我的 BroadcastReceiver 类有一个问题,它作为内部类在我的 MainActivity 中。每次单击应用程序通知中的按钮时,都会收到此错误:

java.lang.RuntimeException: Unable to instantiate receiver com.oniktech.testmediaservice.MainActivity$MediaReceiver: java.lang.InstantiationException: java.lang.Class<com.oniktech.testmediaservice.MainActivity$MediaReceiver> has no zero argument constructor

这是我的代码:

val playPauseAction = NotificationCompat.Action(
            icon, play_pause,
            MediaButtonReceiver.buildMediaButtonPendingIntent(
                this,
                PlaybackStateCompat.ACTION_PLAY_PAUSE
            )
        )

    builder.setContentTitle("my test")
                .addAction(playPauseAction)
                .setStyle(
                    androidx.media.app.NotificationCompat.MediaStyle()
                        .setMediaSession(mediaSession.getSessionToken())
                        .setShowActionsInCompactView(0)
                )

            notificatioManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
            notificatioManager.notify(0, builder.build())

这是我的内部课程:

inner class MediaReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            MediaButtonReceiver.handleIntent(mediaSession, intent)
        }
    }

我知道在这种情况下我不应该使用内部类。但我必须在其中使用我的“mediaSession”对象。我该怎么办?谢谢你的帮助。

4

1 回答 1

2

问题 - 1:MediaReceiver应该Nested只是不是inner。在 Kotlin 中,嵌套类默认是静态的。所以删除 inner 关键字。

class MediaReceiver : BroadcastReceiver() {
}

问题 - 2:您想从 BroadcastReceiver 访问外部类属性,这不是一个好习惯。你应该避免它。但是,如果您仍然想这样做,您应该将该属性设为静态并在 Receiver 中使用它。检查我下面的示例实现。

class MainActivity {
    companion object {
        var mediaSession: MediaSessionCompat? = null
    }

    class MediaReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            MediaButtonReceiver.handleIntent(mediaSession, intent)
        }
    }
}
于 2019-10-30T19:51:50.300 回答