背景
Android 8.0以上版本在后台启动服务的时候,会报Not allowed to start service Intent { cmp=com.mymoney.sms/.service.CoreService }: app is in background uid UidRecord
异常,官方介绍有两种方案可以解决这个问题,第一种是通过startForegroundService
来启动一个前台进程。另一种就是使用JobSchedule。第一种方案有一个问题就是会生成一个通知,那么JobSchedule与后台Service的差别呢?
对比
- JobService的执行需要至少一个条件。没有条件的JobService是无法启动的,在创建JobInfo的时候会抛出异常。
- 启动时机上,JobService必须等待条件满足才会执行,Service是启动后立即执行
- Service的
onStartCommand
执行在UI线程,不可执行耗时任务。JobService的onStartJob
也是执行在UI线程,但不同的是即使在jobService中开启了新线程,处理时间也不能超过10min,超过这个时间JobService会被强制销毁 - 不管应用是否处于前台,JobService都不能无限期运行,有 10 分钟的超时时间,会自动销毁,在 Android L 上这个时间是 1 分钟。因此 Job Scheduler 适用于短耗时的后台任务,不适用于连续的长时间的后台服务。
网友评论