调用startService会抛出IllegalStateException异常解决

 更新时间:2023年07月28日 11:22:17   作者:尹学姐  
这篇文章主要为大家介绍了调用startService会抛出IllegalStateException异常解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

调用startService会抛出IllegalStateException异常

startService可以很方便的启动一个service服务,也可以运行在单独的进程。

但是如果在后台调用了startService,则很可能会抛出一个崩溃。

Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.test.broadservice/.MyService }: app is in background uid UidRecord{b67c471 u0a86 RCVR idle change:uncached procs:1 seq(0,0,0)}
        at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1577)
        at android.app.ContextImpl.startService(ContextImpl.java:1532)
        at android.content.ContextWrapper.startService(ContextWrapper.java:664)
        at android.content.ContextWrapper.startService(ContextWrapper.java:664)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6669) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

错误原因

Android8.0之后,系统增加了对后台Service的限制,如果应用处于后台,调用startService会抛出IllegalStateException

意思是,在后台的应用,不允许调用startService启动一个后台服务,否则就会抛出异常。

解决方法

1. 使用startForegroundService

使用方法比较简单,这里就不列出代码了。

有几点需要注意:

  • 用此方法启动前台服务,会在用户的通知栏上显示
  • 必须在5s内调用服务的startForeground方法,否则会发生ANR

2. 使用JobScheduler

使用JobScheduler可以实现在后台运行任务。

定义一个JobService:

public class MyJobService extends JobService {
    @Override
    public boolean onStartJob(JobParameters params) {
        return false;
    }
    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }
}

onStartJob

  • 运行在主进程,需要避免执行耗时的操作。
  • 返回true:表示任务还在继续执行
  • 返回false:表示任务已执行完
  • 执行完之后,可以调jobFinished方法来通知系统任务已完成。

onStopJob:

  • 当条件不满足的时候,会回调
  • 返回true:表示条件满足时,再次执行任务
  • 返回false:表示任务完全结束

注册JobService

        <service
            android:name=".MyJobService"
            android:permission="android.permission.BIND_JOB_SERVICE" />

定义一个JobInfo

JobInfo.Builder builder = new JobInfo.Builder(111, new ComponentName(this, MyJobService.class));
// todo 设置任务的参数

将任务发布给系统:

JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(builder.build());

3. 使用WorkManager

WorkManagerJobScheduler的升级版本,且支持多进程,可以将任务运行到单独的进程中。具体使用方法可以参考之前的文章:应用退出后继续运行后台任务,来试试WorkManager吧!

总结

Android 8.0版本以上,在后台调用startService会抛出IllegalStateException异常,需要改用其他的方式来使用。

常用的方法有如下三种:

  • startForegroundService: 这种方式会在用户的通知栏显示UI。
  • JobScheduler:可以实现后台无感知运行任务。
  • WorkManagerJetpack里的库,JobScheduler的升级版,支持多进程。

以上就是调用startService会抛出IllegalStateException异常解决的详细内容,更多关于startService IllegalStateException的资料请关注脚本之家其它相关文章!

相关文章

  • Android Studio如何快速导入jar和.so文件

    Android Studio如何快速导入jar和.so文件

    这篇文章主要介绍了Android Studio如何快速导入jar和.so文件的相关知识,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-12-12
  • 利用Android中的TextView实现逐字显示动画

    利用Android中的TextView实现逐字显示动画

    在安卓程序启动的时候,想逐字显示一段话,每个字都有一个从透明到不透明的渐变动画。那如何显示这个效果,下面一起来看看。
    2016-08-08
  • Listview的异步加载性能优化

    Listview的异步加载性能优化

    Android中ListView是使用平率最高的控件之一(GridView跟ListView是兄弟,都是继承AbsListView),ListView优化最有效的无非就是采用ViewHolder来减少频繁的对view查询和更新,缓存图片加快解码,减小图片尺寸
    2016-01-01
  • android:layout_gravity和android:gravity的区别

    android:layout_gravity和android:gravity的区别

    本篇文章主要介绍了android中giavity和layout_gravity的区别。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • Android使用Intent传递组件大数据

    Android使用Intent传递组件大数据

    这篇文章主要介绍了Android使用Intent传递组件大数据,文章围绕主题展开详细的内容详情,感兴趣的朋友可以参考一下
    2022-07-07
  • Android手势ImageView三部曲 第三部

    Android手势ImageView三部曲 第三部

    这篇文章主要为大家详细介绍了Android手势ImageView三部曲的第三部,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Android OkHttp代理与路由的彻底理解

    Android OkHttp代理与路由的彻底理解

    这篇文章主要为大家介绍了Android OkHttp代理与路由的彻底理解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • RecyclerView的使用之HelloWorld

    RecyclerView的使用之HelloWorld

    RecyclerView是伴随Android 5.0发布的新控件,是一种列表容器,Google意在用新的RecyclerView来取代老旧的ListView和GridView,它的使用灵活性和性能都要优于ListView,通过本文给大家介绍RecyclerView的使用之HelloWorld,需要的朋友参考下
    2016-03-03
  • Android Studio 3.0上分析内存泄漏的原因

    Android Studio 3.0上分析内存泄漏的原因

    本篇文章主要介绍了Android Studio 3.0上分析内存泄漏的原因,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Kotlin设计模式之委托模式使用方法详解

    Kotlin设计模式之委托模式使用方法详解

    Kotlin提供了两个本机功能来实现委托模式,第一个是接口委托(例如策略模式),另一种是属性委托,它专注于类成员/属性(例如延迟加载、observable等),它们共同提供了一组丰富而简洁的功能,通过本博客,您将了解在什么情况下使用此模式
    2023-09-09

最新评论