調用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之后,系統(tǒng)增加了對后臺Service的限制,如果應用處于后臺,調用startService會拋出IllegalStateException。
意思是,在后臺的應用,不允許調用startService啟動一個后臺服務,否則就會拋出異常。
解決方法
1. 使用startForegroundService
使用方法比較簡單,這里就不列出代碼了。
有幾點需要注意:
- 用此方法啟動前臺服務,會在用戶的通知欄上顯示
- 必須在
5s內(nèi)調用服務的startForeground方法,否則會發(fā)生ANR
2. 使用JobScheduler
使用JobScheduler可以實現(xiàn)在后臺運行任務。
定義一個JobService:
public class MyJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
return false;
}
}onStartJob:
- 運行在主進程,需要避免執(zhí)行耗時的操作。
- 返回true:表示任務還在繼續(xù)執(zhí)行
- 返回false:表示任務已執(zhí)行完
- 執(zhí)行完之后,可以調jobFinished方法來通知系統(tǒng)任務已完成。
onStopJob:
- 當條件不滿足的時候,會回調
- 返回true:表示條件滿足時,再次執(zhí)行任務
- 返回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 設置任務的參數(shù)
將任務發(fā)布給系統(tǒng):
JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.schedule(builder.build());
3. 使用WorkManager
WorkManager是JobScheduler的升級版本,且支持多進程,可以將任務運行到單獨的進程中。具體使用方法可以參考之前的文章:應用退出后繼續(xù)運行后臺任務,來試試WorkManager吧!
總結
Android 8.0版本以上,在后臺調用startService會拋出IllegalStateException異常,需要改用其他的方式來使用。
常用的方法有如下三種:
startForegroundService: 這種方式會在用戶的通知欄顯示UI。JobScheduler:可以實現(xiàn)后臺無感知運行任務。WorkManager:Jetpack里的庫,JobScheduler的升級版,支持多進程。
以上就是調用startService會拋出IllegalStateException異常解決的詳細內(nèi)容,更多關于startService IllegalStateException的資料請關注腳本之家其它相關文章!
相關文章
利用Android中的TextView實現(xiàn)逐字顯示動畫
在安卓程序啟動的時候,想逐字顯示一段話,每個字都有一個從透明到不透明的漸變動畫。那如何顯示這個效果,下面一起來看看。2016-08-08
android:layout_gravity和android:gravity的區(qū)別
本篇文章主要介紹了android中giavity和layout_gravity的區(qū)別。具有很好的參考價值。下面跟著小編一起來看下吧2017-04-04
Android使用Intent傳遞組件大數(shù)據(jù)
這篇文章主要介紹了Android使用Intent傳遞組件大數(shù)據(jù),文章圍繞主題展開詳細的內(nèi)容詳情,感興趣的朋友可以參考一下2022-07-07
Android Studio 3.0上分析內(nèi)存泄漏的原因
本篇文章主要介紹了Android Studio 3.0上分析內(nèi)存泄漏的原因,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11

