我正在尝试从AudioService.getAudioSessionId()
致电MainActivity
我不知道如何在它们之间建立参考,并且我在网上找到的示例非常古老。
class AudioService: Service() {
private var mediaPlayer: MediaPlayer? = null
override fun onBind(p0: Intent?): IBinder? {
// TODO
return null
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
// TODO
return super.onStartCommand(intent, flags, startId)
}
override fun onCreate() {
mediaPlayer = MediaPlayer.create(this, R.raw.eazye)
mediaPlayer?.isLooping = true
mediaPlayer?.start()
}
override fun onDestroy() {
mediaPlayer?.stop()
mediaPlayer?.release()
mediaPlayer = null
}
// TODO how do I get this?
fun getAudioSessionId(): Int? {
return mediaPlayer?.audioSessionId
}
}
// How the service is started in MainActivity:
val service = Intent(this, AudioService::class.java)
startService(service)
val i = service.getAudioSessionId() // Unresolved reference
答案 0 :(得分:0)
感谢@Tim Castelijns,我使用bound services.
实现了此操作// AudioService.kt
class AudioService: Service() {
private var mediaPlayer: MediaPlayer? = null
private val binder = AudioBinder()
inner class AudioBinder: Binder() {
fun getService(): AudioService = this@AudioService
}
override fun onBind(p0: Intent?): IBinder? {
return binder
}
override fun onCreate() {
mediaPlayer = MediaPlayer.create(this, R.raw.eazye)
mediaPlayer?.isLooping = true
mediaPlayer?.start()
}
override fun onDestroy() {
mediaPlayer?.stop()
mediaPlayer?.release()
mediaPlayer = null
}
fun getAudioSessionId(): Int? {
return mediaPlayer?.audioSessionId
}
fun bark(): String {
return "WOOF!" // You could also call this for example
}
}
// MainActivity.kt
class MainActivity : AppCompatActivity() {
private lateinit var audioService: AudioService
private var isAudioServiceBound: Boolean = false
private val connection = object: ServiceConnection {
override fun onServiceConnected(className: ComponentName?, service: IBinder?) {
val binder = service as AudioService.AudioBinder
audioService = binder.getService()
isAudioServiceBound = true
}
override fun onServiceDisconnected(p0: ComponentName?) {
isAudioServiceBound = false
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
/* Graphics */
btnPlay.setOnClickListener {
Intent(this, AudioService::class.java).also {
bindService(it, connection, Context.BIND_AUTO_CREATE)
}
}
btnStop.setOnClickListener {
if (isAudioServiceBound) {
unbindService(connection)
isAudioServiceBound = false
}
}
btnTest.setOnClickListener {
if (isAudioServiceBound) {
val id = audioService.getAudioSessionId()
Toast.makeText(this, audioService.bark(), Toast.LENGTH_SHORT).show()
}
}
}
}
我认为这是最简单的方法。