You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调用stopScheduleRestore后onStopJob未触发?

Android JobScheduler调用cancel后未触发onStopJob的原因分析

我来帮你拆解下为啥调用stopScheduleRestore后,OnStop日志没打出来的问题~

首先得明确JobScheduler里cancel()方法和onStopJob()的触发逻辑:

  • cancel()的作用是取消待执行的任务,而非终止正在运行的任务:当你调用cancel()时,它只会移除还没被调度执行的Job任务队列。如果你的RestoreService已经处于运行状态(也就是onStartJob已经被调用,后台线程已经启动),这时候cancel()并不会主动去终止这个正在运行的Job,自然也不会触发onStopJob。
  • onStopJob()的触发条件是系统主动终止运行中的Job:这个方法只有在系统因为资源紧张、Job运行超时或者其他系统层面的原因,需要强制终止正在运行的Job时才会被调用。手动调用cancel()并不属于这个触发场景。

再看你的代码逻辑:onStartJob返回true表示你会手动调用jobFinished来结束任务。当你的后台线程执行完completeJob并调用jobFinished(parameters, false)后,这个Job就已经处于完成状态了,此时再调用cancel(),其实已经没有正在运行的Job可以终止,所以onStopJob根本不会被触发。

给你几个解决思路:

  • 如果希望手动取消时执行清理逻辑,可以在调用cancel()之后,给RestoreService发送一个自定义指令(比如用LocalBroadcastManager发送广播,或者用协程、事件总线通知),让服务自己终止后台线程并执行OnStop对应的逻辑。
  • 要是想让onStopJob被触发,得确保Job还在运行状态(也就是还没调用jobFinished)时,系统主动终止它——比如你可以设置Job的超时时间,或者让系统在资源不足时终止Job,这时候onStopJob才会被调用。

附上你的代码方便对照:

class RestoreService : JobService() { 
    override fun onStartJob(params: JobParameters): Boolean { 
        logError("OnStart") 
        Thread(Runnable { completeJob(params) }).start() 
        return true 
    } 

    override fun onStopJob(params: JobParameters): Boolean { 
        logError("OnStop") 
        return false 
    } 

    fun completeJob(parameters: JobParameters) { 
        logError("OK") 
        jobFinished(parameters, false) 
    } 
} 

fun startScheduleRestore(mContext:Context){ 
    val mJobScheduler = mContext.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler 
    val jobInfo = JobInfo.Builder(mContext.getInteger(R.integer.JobID), ComponentName(mContext.packageName, RestoreService::class.java.name)) 
        .setPeriodic(interval) 
        .setPersisted(true) 
        .build() 
    mJobScheduler.schedule(jobInfo) 
} 

fun stopScheduleRestore(mContext:Context){ 
    val mJobScheduler = mContext.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler 
    mJobScheduler.cancel(mContext.getInteger(R.integer.JobID)) 
}

内容的提问来源于stack exchange,提问作者HelloCW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:51:50