Как привязать к LocalService и вызвать getRandomNumber () без кнопки? - PullRequest
0 голосов
/ 07 апреля 2019

Я устанавливаю новый LocalService с помощью этого метода getRandomNumber() и хочу автоматически вызывать его с BindingActivity, когда это действие связывается с Service без кнопки. Как мне позвонить getRandomNumber(), прежде чем пользователь начнет использовать BindingActivity?

Когда я использую getRandomNumber() метод внутри onCreate, onStart или onResume. Ошибка

Код LocalService:

class LocalService : Service() {
    // Binder given to clients
    private val binder = LocalBinder()

    // Random number generator
    private val mGenerator = Random()

    /** method for clients  */
    val randomNumber: Int
        get() = mGenerator.nextInt(100)

    /**
     * Class used for the client Binder.  Because we know this service always
     * runs in the same process as its clients, we don't need to deal with IPC.
     */
    inner class LocalBinder : Binder() {
        // Return this instance of LocalService so clients can call public methods
        fun getService(): LocalService = this@LocalService
    }

    override fun onBind(intent: Intent): IBinder {
        return binder
    }
}

Код BindingActivity:

class BindingActivity : Activity() {
    private lateinit var mService: LocalService
    private var mBound: Boolean = false

    /** Defines callbacks for service binding, passed to bindService()  */
    private val connection = object : ServiceConnection {

        override fun onServiceConnected(className: ComponentName, service: IBinder) {
            // We've bound to LocalService, cast the IBinder and get LocalService instance
            val binder = service as LocalService.LocalBinder
            mService = binder.getService()
            mBound = true
        }

        override fun onServiceDisconnected(arg0: ComponentName) {
            mBound = false
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main)
    }

    override fun onStart() {
        super.onStart()
        // Bind to LocalService
        Intent(this, LocalService::class.java).also { intent ->
            bindService(intent, connection, Context.BIND_AUTO_CREATE)
        }

        // PROBLEM
        val num: Int = mService.randomNumber
        Toast.makeText(this, "number: $num", Toast.LENGTH_SHORT).show()
    }

    override fun onStop() {
        super.onStop()
        unbindService(connection)
        mBound = false
    }
}

От: https://developer.android.com/guide/components/bound-services#Binder

Я ожидаю, что эта строка будет работать внутри onStart метода: val num: Int = mService.randomNumber но моя деятельность прекращается!

1 Ответ

0 голосов
/ 07 апреля 2019

bindService является асинхронным. Вот почему у вас есть обратный вызов с onServiceConnected().

Чтобы получить доступ к услуге, нужно дождаться, когда будет вызван onServiceConnected(). В этом тривиальном примере я бы просто поместил эти строки под // PROBLEM в нижней части onServiceConnected().

class BindingActivity : Activity() {
    private lateinit var mService: LocalService
    private var mBound: Boolean = false

    /** Defines callbacks for service binding, passed to bindService()  */
    private val connection = object : ServiceConnection {

        override fun onServiceConnected(className: ComponentName, service: IBinder) {
            // We've bound to LocalService, cast the IBinder and get LocalService instance
            val binder = service as LocalService.LocalBinder
            mService = binder.getService()
            mBound = true

            val num: Int = mService.randomNumber
            Toast.makeText(this, "number: $num", Toast.LENGTH_SHORT).show()
        }

        override fun onServiceDisconnected(arg0: ComponentName) {
            mBound = false
        }
    }

    ...

    override fun onStart() {
        super.onStart()
        // Bind to LocalService
        Intent(this, LocalService::class.java).also { intent ->
            bindService(intent, connection, Context.BIND_AUTO_CREATE)
        } 
    }

    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...