首页 > 解决方案 > 执行功能,无论活动完成

问题描述

目前,我正在制作一个基于 Kotlin 的 Android 应用程序。我在工作的时候出现了一个问题,问题是我需要使用一个不管活动结束都运行的函数,但我不知道怎么做。参照我插的图来说明,函数在Activity 1中被调用并执行,Activity 1被终止(finish()),但是被调用的函数必须要执行,而且在Activity中调用函数应该也是可以的2和活动3。由于我搜索这个,我坚持使用协程。请检查结果是否正确。作为参考,应该执行的函数是一个倒数计时器,即使在应用程序关闭时也会运行。

在此处输入图像描述

功能(start_timer)

fun start_timer() {
    if(mTimerRunning){
    }
    else {
        startTimer()
    }
}
//timer_zone
private fun startTimer() {
    mEndTime = System.currentTimeMillis() + mTimeLeftInMillis
    mCountDownTimer = object : CountDownTimer(mTimeLeftInMillis, 1000) {
        override fun onTick(millisUntilFinished: Long) {
            mTimeLeftInMillis = millisUntilFinished
            updateCountDownText()
        }

        override fun onFinish() {
            My_App_Data.check_heart +=1
            mTimerRunning = false
            //
            resetTimer()
            if(My_App_Data.check_heart <5){
                startTimer()
            }
            else{
            }

        }
    }.start()
    mTimerRunning = true
}

private fun pauseTimer() {
    mCountDownTimer!!.cancel()
    mTimerRunning = false
}

private fun resetTimer() {
    mTimeLeftInMillis = START_TIME_IN_MILLIS
    updateCountDownText()
    //check_heart+=1
}

private fun updateCountDownText() {
    val minutes = (mTimeLeftInMillis / 1000).toInt() / 60
    val seconds = (mTimeLeftInMillis / 1000).toInt() % 60
    val timeLeftFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds)
    //mTextViewCountDown!!.text = timeLeftFormatted
    My_App_Data.reset_heart_timer =timeLeftFormatted


}


override fun onStop() {
    super.onStop()
    val prefs = getSharedPreferences("prefs", MODE_PRIVATE)
    val editor = prefs.edit()
    editor.putLong("millisLeft", mTimeLeftInMillis)
    editor.putBoolean("timerRunning", mTimerRunning)
    editor.putLong("endTime", mEndTime)
    editor.apply()
    if (mCountDownTimer != null) {
        mCountDownTimer!!.cancel()
    }
}

override fun onStart() {
    super.onStart()
    val prefs = getSharedPreferences("prefs", MODE_PRIVATE)
    mTimeLeftInMillis = prefs.getLong("millisLeft", START_TIME_IN_MILLIS)
    mTimerRunning = prefs.getBoolean("timerRunning", false)
    updateCountDownText()
    if (mTimerRunning) {
        mEndTime = prefs.getLong("endTime", 0)
        mTimeLeftInMillis = mEndTime - System.currentTimeMillis()
        if (mTimeLeftInMillis < 0) {
            mTimeLeftInMillis = 0
            mTimerRunning = false
            updateCountDownText()
        } else {
            startTimer()
        }
    }
}

companion object {
    private const val START_TIME_IN_MILLIS: Long = 10000
}

标签: androidkotlinkotlin-coroutines

解决方案


这是您所描述的延期工作。对于此 Android 官方文档,推荐使用WorkManager. 考虑使用它,因为它旨在能够在后台完成任务,无论 Activity 是否在前台或应用程序被杀死。

请参阅工作管理器

“WorkManager 是一个库,用于将可延迟的工作排入队列,保证在满足其约束后的某个时间执行。”


推荐阅读