我有运行音乐的服务。我需要能够通过不同的活动控制MediaPlayer。因此,我以这种方式编写了服务,即从不同的活动中仅调用myService?.musicControl(“ ACTION_HERE”)。但是出于某种原因,开始有效,但是其他动作(暂停,恢复和停止)不起作用。
MusicService.kt
class MusicService : Service() {
private val myBinder = MyLocalBinder()
override fun onCreate() {
super.onCreate()
musicControl("play")
}
override fun onBind(intent: Intent?): IBinder? {
return myBinder
}
inner class MyLocalBinder : Binder() {
fun getService() : MusicService {
return this@MusicService
}
}
fun musicControl(action: String) {
var player = MediaPlayer.create(this, R.raw.slunky)
var length = 0
if (player != null) {
if (action == "play") {
player.isLooping = true
player.setVolume(1f, 1f)
player.start()
} else if (action == "pause") {
length = player.currentPosition;
player.pause()
} else if (action == "resume") {
player.seekTo(length)
player.start()
} else if (action == "stop") {
player.stop()
}
} else {Toast.makeText(this, "NULL", Toast.LENGTH_SHORT).show()}
}
}
在MainActivity中创建时
val musicIntent = Intent(this, MusicService::class.java)
startService(musicIntent)
bindService(intent, myConnection, Context.BIND_AUTO_CREATE)
UPD:工作代码。谢谢你,NamNH。
class MusicService : Service() {
private val myBinder = MyLocalBinder()
private var player: MediaPlayer? = null
private var length = 0
override fun onCreate() {
super.onCreate()
player = MediaPlayer.create(this, R.raw.slunky)
musicControl("play")
}
override fun onBind(intent: Intent?): IBinder? {
return myBinder
}
inner class MyLocalBinder : Binder() {
fun getService() : MusicService {
return this@MusicService
}
}
fun musicControl(action: String) {
if (player != null) {
if (action == "play") {
player!!.isLooping = true
player!!.setVolume(1f, 1f)
player!!.start()
} else if (action == "pause") {
length = player!!.currentPosition;
player!!.pause()
} else if (action == "resume") {
player!!.seekTo(length)
player!!.start()
} else if (action == "stop") {
player!!.stop()
}
} else {Toast.makeText(this, "NULL", Toast.LENGTH_SHORT).show()}
}
}