为何调用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
相关产品推荐
相关产品推荐

