Моя служба не прекратится, даже если онДестрой уволен

#java #android #kotlin #service

#java #Android #kotlin #Обслуживание

Вопрос:

У меня есть a 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)
 

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

Редактировать

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

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

Ответ №1:

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

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

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

Комментарии:

1. @StuartDTO выглядит нормально, но вам следует подумать о том, чтобы изменить свой mTimer , calendar и simpleDateFormat lateinit var вместо того, чтобы выполнять грязные, не нулевые приведения ( !! ), тщательно изучите свой код.

2. Спасибо за совет 😉