Мой сервис не остановится, даже если запущен onDestroy - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть Service, который действует как TimerTask, и даже если я остановлю службу, используя:

val intent = Intent(applicationContext, TimeService::class.java)
stopService(intent)

Это не останавливается, у меня есть Log в onDestroy, и это Log запускается ... но я думаю, проблема в том, что я использую TimerTask внутри Service этого мой Service

class TimeService : Service() {
    private val mHandler = Handler()
    var calendar: Calendar? = null
    var simpleDateFormat: SimpleDateFormat? = null
    var strDate: String? = null
    var date_current: Date? = null
    var date_diff: Date? = null
    private var mTimer: Timer? = null
    private val NOTIFY_INTERVAL: Long = 1000
    var intent: Intent? = null

    companion object {
        val str_receiver = "myreceiver"
    }

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

    override fun onCreate() {
        super.onCreate()


        calendar = Calendar.getInstance()
        simpleDateFormat = SimpleDateFormat("HH:mm:ss", Locale.getDefault())

        mTimer = Timer()
        mTimer!!.scheduleAtFixedRate(TimeDisplayTimerTask(), 5, NOTIFY_INTERVAL)
        intent = Intent(str_receiver)
    }

    internal inner class TimeDisplayTimerTask : TimerTask() {

        override fun run() {
            mHandler.post {
                calendar = Calendar.getInstance()
                simpleDateFormat = SimpleDateFormat("HH:mm:ss", Locale.getDefault())
                strDate = simpleDateFormat!!.format(calendar!!.time)
                Log.e("strDate", strDate)
                twoDatesBetweenTime()
            }
        }

    }

    fun twoDatesBetweenTime(): String {


        try {
            date_current = simpleDateFormat!!.parse(strDate)
        } catch (e: Exception) {

        }

        try {
            date_diff = simpleDateFormat!!.parse(SharedPreferenceHelper.defaultPrefs(this).getString("data", ""))
        } catch (e: Exception) {

        }

        try {


            val diff = date_current!!.time - date_diff!!.time
            val timeInSeconds = Integer.valueOf(SharedPreferenceHelper.defaultPrefs(this).getString("seconds", "")!!)

            val timeTimer = TimeUnit.SECONDS.toMillis(timeInSeconds.toLong())
            val diffWithTime = timeTimer - diff
            val diffSeconds2 = diffWithTime / 1000 % 60
            val diffMinutes2 = diffWithTime / (60 * 1000) % 60
            val diffHours2 = diffWithTime / (60 * 60 * 1000) % 24


            if (diffWithTime >= 0) {
                val counterTime = "$diffHours2  :  $diffMinutes2 : $diffSeconds2"

                Log.e("TIME", counterTime)

                fn_update(counterTime)
            } else {
                SharedPreferenceHelper.defaultPrefs(this).edit().putBoolean("finish", true).apply()
                mTimer!!.cancel()
            }
        } catch (e: Exception) {
            mTimer!!.cancel()
            mTimer!!.purge()


        }

        return ""

    }

    override fun onDestroy() {
        super.onDestroy()
        Log.e("Service finish", "Finish")
    }

    private fun fn_update(str_time: String) {

        intent!!.putExtra("time", str_time)
        sendBroadcast(intent)
    }
}

И проблема в том, что этот журнал:

Log.e("strDate", strDate)

И этот журнал:

Log.e("TIME", counterTime)

Никогда не останавливается, чего мне не хватает?

EDIT

Мой подход к этому моменту, но я не знаю, лучший ли это путь:

override fun onDestroy() {
    super.onDestroy()
    Log.e("Service finish", "Finish")
    if(mTimer!=null){
        mTimer!!.cancel()
        mTimer!!.purge()
    }
}

1 Ответ

2 голосов
/ 16 апреля 2019

OnDestroy - это метод обратного вызова, который вызывается системой для предоставления вашему сервису «чистого выхода»:

Вызывается системой для уведомления службы о том, что она больше не используется и удаляется. Служба должна очистить все ресурсы, которые она содержит (потоки, зарегистрированные получатели и т. Д.) На этом этапе. По возвращении больше не будет вызовов к этому объекту Сервиса, и он фактически мертв. Не вызывайте этот метод напрямую.

Система не прерывает процесс вашего приложения сразу после этого обратного вызова. Это до вас, чтобы убить TimerTask на этом этапе. Если вы оставите его работающим, это считается утечкой. Скорее всего, он будет работать до тех пор, пока система не решит, что пришло время завершить процесс ваших приложений, что может занять некоторое время, если он останется на переднем плане.

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