как сделать так, чтобы сервис запускался с интервалами android - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь сделать так, чтобы служба выполнялась и выполнялась через определенные промежутки времени, с помощью этой статьи Мне удалось настроить службу и установить интервал в 1000 миллисекунд для входа в мою консоль, но я заметил, что служба запускается только один раз. Вот фрагмент моего кода:

    class MessageService : Service() {

private var serviceLooper: Looper? = null
private var serviceHandler: ServiceHandler? = null

override fun onCreate() {
    val context:Context = this
    HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND).apply {
        start()
        serviceLooper = looper
        serviceHandler = ServiceHandler(context, looper)
    }
}

override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
    Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show()
    serviceHandler?.obtainMessage()?.also { msg ->
        msg.arg1 = startId
        serviceHandler?.sendMessage(msg)
    }

    return START_STICKY
}

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

override fun onDestroy() {}

private inner class ServiceHandler(context: Context, looper: Looper) : Handler(looper) {

    val baseContext = context
    override fun handleMessage(msg: Message) {
        val runnable = Runnable {
            Log.i("thread", "service has been called")
        }
        this.postDelayed(runnable, 1000)
    }
}

}

пожалуйста, что я делаю не так?

1 Ответ

0 голосов
/ 17 июня 2020

Основная проблема заключается в том, что вы создаете НОВЫЙ обработчик, используя val handler = Handler() после первого правильного вызова handleMessage (), поэтому каждый postDelayed() отправит запускаемый объект в «неуправляемый» обработчик (я называю «неуправляемым» "потому что только что созданный объект не переопределил метод handleMessage (..)"). Вам нужно от postDelayed() до serviceHandler, а не до нового обработчика. Чтобы исправить это, вы можете использовать this.postDelayed(...), потому что вы находитесь внутри ServiceHandler и хотите опубликовать Runnable в том же Handler.

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