从活动访问服务方法

时间:2019-08-02 12:18:06

标签: android kotlin service

我正在尝试从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

1 个答案:

答案 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()
            }
        }
    }
}

See the code as a Github Gist

我认为这是最简单的方法。