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