調(diào)用startService會(huì)拋出IllegalStateException異常解決
調(diào)用startService會(huì)拋出IllegalStateException異常
startService
可以很方便的啟動(dòng)一個(gè)service
服務(wù),也可以運(yùn)行在單獨(dú)的進(jìn)程。
但是如果在后臺(tái)調(diào)用了startService
,則很可能會(huì)拋出一個(gè)崩潰。
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)
錯(cuò)誤原因
Android8.0
之后,系統(tǒng)增加了對(duì)后臺(tái)Service
的限制,如果應(yīng)用處于后臺(tái),調(diào)用startService
會(huì)拋出IllegalStateException
。
意思是,在后臺(tái)的應(yīng)用,不允許調(diào)用startService
啟動(dòng)一個(gè)后臺(tái)服務(wù),否則就會(huì)拋出異常。
解決方法
1. 使用startForegroundService
使用方法比較簡(jiǎn)單,這里就不列出代碼了。
有幾點(diǎn)需要注意:
- 用此方法啟動(dòng)前臺(tái)服務(wù),會(huì)在用戶的通知欄上顯示
- 必須在
5s
內(nèi)調(diào)用服務(wù)的startForeground
方法,否則會(huì)發(fā)生ANR
2. 使用JobScheduler
使用JobScheduler可以實(shí)現(xiàn)在后臺(tái)運(yùn)行任務(wù)。
定義一個(gè)JobService:
public class MyJobService extends JobService { @Override public boolean onStartJob(JobParameters params) { return false; } @Override public boolean onStopJob(JobParameters params) { return false; } }
onStartJob
:
- 運(yùn)行在主進(jìn)程,需要避免執(zhí)行耗時(shí)的操作。
- 返回true:表示任務(wù)還在繼續(xù)執(zhí)行
- 返回false:表示任務(wù)已執(zhí)行完
- 執(zhí)行完之后,可以調(diào)jobFinished方法來(lái)通知系統(tǒng)任務(wù)已完成。
onStopJob
:
- 當(dāng)條件不滿足的時(shí)候,會(huì)回調(diào)
- 返回true:表示條件滿足時(shí),再次執(zhí)行任務(wù)
- 返回false:表示任務(wù)完全結(jié)束
注冊(cè)JobService
:
<service android:name=".MyJobService" android:permission="android.permission.BIND_JOB_SERVICE" />
定義一個(gè)JobInfo
:
JobInfo.Builder builder = new JobInfo.Builder(111, new ComponentName(this, MyJobService.class)); // todo 設(shè)置任務(wù)的參數(shù)
將任務(wù)發(fā)布給系統(tǒng):
JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.schedule(builder.build());
3. 使用WorkManager
WorkManager
是JobScheduler
的升級(jí)版本,且支持多進(jìn)程,可以將任務(wù)運(yùn)行到單獨(dú)的進(jìn)程中。具體使用方法可以參考之前的文章:應(yīng)用退出后繼續(xù)運(yùn)行后臺(tái)任務(wù),來(lái)試試WorkManager吧!
總結(jié)
Android 8.0
版本以上,在后臺(tái)調(diào)用startService
會(huì)拋出IllegalStateException
異常,需要改用其他的方式來(lái)使用。
常用的方法有如下三種:
startForegroundService
: 這種方式會(huì)在用戶的通知欄顯示UI。JobScheduler
:可以實(shí)現(xiàn)后臺(tái)無(wú)感知運(yùn)行任務(wù)。WorkManager
:Jetpack
里的庫(kù),JobScheduler
的升級(jí)版,支持多進(jìn)程。
以上就是調(diào)用startService會(huì)拋出IllegalStateException異常解決的詳細(xì)內(nèi)容,更多關(guān)于startService IllegalStateException的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android App端與PHP Web端的簡(jiǎn)單數(shù)據(jù)交互實(shí)現(xiàn)示例
本篇文章主要介紹了Android App端與PHP Web端的簡(jiǎn)單數(shù)據(jù)交互實(shí)現(xiàn)示例,詳細(xì)的介紹了交互的代碼,非常具有實(shí)用價(jià)值,有興趣的可以了解一下2017-10-10Android開(kāi)發(fā)中下拉刷新如何實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android開(kāi)發(fā)中下拉刷新的實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下2016-07-07Android實(shí)現(xiàn)手機(jī)壁紙改變的方法
這篇文章主要介紹了Android實(shí)現(xiàn)手機(jī)壁紙改變的方法,以完整實(shí)例形式分析了Android手機(jī)壁紙改變的方法,包括頁(yè)面布局及屬性設(shè)置的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09Android FTP 多線程斷點(diǎn)續(xù)傳下載\上傳的實(shí)例
本篇文章主要介紹了Android FTP 多線程斷點(diǎn)續(xù)傳下載\上傳的實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08Android開(kāi)發(fā)筆記之如何正確獲取WebView的網(wǎng)頁(yè)Title
獲取h5頁(yè)面的攜帶的title中是很簡(jiǎn)單的,下面這篇文章主要給大家介紹了關(guān)于Android開(kāi)發(fā)筆記之如何正確獲取WebView的網(wǎng)頁(yè)Title的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面來(lái)一起看看吧2018-09-09flutter開(kāi)發(fā)的app項(xiàng)目?打包成web
如果你的Flutter版本低于2.0,請(qǐng)先升級(jí)Flutter版本,創(chuàng)建一個(gè)web文件夾來(lái)存放web相關(guān)的資源,使用HTML渲染器打包,該渲染器提供的打開(kāi)速度最快,并且具有良好的瀏覽器兼容性,使用默認(rèn)設(shè)置進(jìn)行打包,提供的打開(kāi)速度為一般,但依然保持良好的瀏覽器兼容性2024-08-08Android自定義EditText實(shí)現(xiàn)淘寶登錄功能
這篇文章主要為大家詳細(xì)介紹了Android自定義EditText實(shí)現(xiàn)淘寶登錄功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Android開(kāi)發(fā)自定義控件之折線圖實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Android開(kāi)發(fā)自定義控件之折線圖實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Android自定義控件中折線圖原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2020-05-05Android中判斷當(dāng)前API的版本號(hào)方法
下面小編就為大家分享一篇Android中判斷當(dāng)前API的版本號(hào)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03Android Bluetooth藍(lán)牙技術(shù)使用流程詳解
這篇文章主要介紹了Android Bluetooth藍(lán)牙技術(shù)使用流程詳解的相關(guān)資料,需要的朋友可以參考下2016-02-02