错误:无法实例化接收器...没有零参数构造函数

时间:2019-10-30 16:54:24

标签: android kotlin

我的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”对象。 我该怎么办? 谢谢您的帮助。

1 个答案:

答案 0 :(得分:1)

问题-1:您的MediaReceiver应该是Nested,而不是inner。在Kotlin中,嵌套类默认为静态。因此,删除内部关键字。

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)
        }
    }
}