startService别乱用,小心IllegalStateEx

2023-03-16  本文已影响0人  尹学姐

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

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

有几点需要注意:

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

onStopJob:

注册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异常,需要改用其他的方式来使用。

常用的方法有如下三种:

上一篇 下一篇

猜你喜欢

热点阅读